Java 8 新特性
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。
新特性
Java8 新增了非常多的特性,我们主要讨论以下几个:
Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。
方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
Date Time API − 加强对日期与时间的处理。
Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
以上为引用。。。。。
为什么使用java8?
写出更简洁的代码,提高编码效率-会偷懒的程序员才是好程序员.
下面看代码来演示java8的强大之处.
一.新建一个学生对象,list中根据学生对象的年龄大小或者性别得到新的学生list
public class Student { private String name; private int age; private String sex; @Override public String toString() { return "Student [getName()=" + getName() + ", getAge()=" + getAge() + ", getSex()=" + getSex() + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Student(String name, int age, String sex) { super(); this.name = name; this.age = age; this.sex = sex; }
二.实现
赋值
List<Student> list=Arrays.asList( new Student("里斯", 12, "男"), new Student("刘丽", 18, "女"), new Student("王五", 22, "男"));
(1)list遍历对比
public static List<Student> getBySex(List<Student> list){ List<Student> students=new ArrayList<Student>(); for (Student student : list) { if(student.getSex().equals("男")){ students.add(student); } } return students; }
如上方法,当我们新添加属性晒选的时候就需要进行添加新的静态方法(如果晒选出年龄大于12岁),后面加任何晒选条件我们都要去进行添加新的方法。。。。
(2)优化-策略模式,新建接口并进行实现
public interface StudentFilter<T> { public Boolean filter(T t); }
public class StudentFilterImpl implements StudentFilter<Student>{ @Override public Boolean filter(Student t) { // TODO Auto-generated method stub return t.getAge()>12; } }
调用
List<Student> byFilter = getByFilter(list, new StudentFilterImpl()); for (Student student : byFilter) { System.out.println(student); }
public static List<Student> getByFilter(List<Student> list,StudentFilter<Student> s){ List<Student> students=new ArrayList<Student>(); for (Student student : list) { if(s.filter(student)){ students.add(student); } } return students; }
如上方法,相对于新建静态方法无疑进步了许多,代码的冗余减少了,更加简洁了,但是如果我们还要加新的晒选条件,
这时又要在接口中继续写方法和实现
(3)匿名内部类
如上,建立接口,将实现写在匿名内部类中
List<Student> byFilterNoName = getByFilter(list, new StudentFilter<Student>() { @Override public Boolean filter(Student t) { return t.getAge()>12; } }); for (Student student : byFilterNoName) { System.out.println(student); }
(4)java8
相对匿名类来说,无疑更加简洁,也更易于理解
List<Student> byFilterNoNames = getByFilter(list, (e)->e.getSex().equals("男")); for (Student student : byFilterNoNames) { System.out.println(student); }
final
使用java8的stream和表达式
list.stream() .filter((e) -> e.getAge() >12) .forEach(System.out::println);
总结:无疑,使用了java8之后实现我们的需求代码量越来越简洁,这样一步一步对比下来,你学习的成本与你长年累月工作中节省下来的时间,哪个更划算?