java8新特性-为什么使用java8

时间:2023-01-31 11:50:19

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之后实现我们的需求代码量越来越简洁,这样一步一步对比下来,你学习的成本与你长年累月工作中节省下来的时间,哪个更划算?