java8的新特性:java stream&lamba表达式

1. lambda表达式

函数式接口简单来说就是只有一个抽象函数的接口。为了使得函数式接口的定义更加规范,java8 提供了@FunctionalInterface 注解告诉编译器在编译器去检查函数式接口的合法性,以便在编译器在编译出错时给出提示。

1.1 操作符

java8中引入了操作符“->”,称为箭头操作符或lambda操作符,lambda用于替换匿名函数。lambda操作符将lambda表达式拆成两个部分:
(1)左侧是lambda表达式的参数列表(可以理解为抽象方法的参数)
(2)右侧是lambda表达式中需要执行的功能,即lambda体(可以理解为抽象方法的实现的功能)

  • 格式一:无参数,无返回值:
    ()->System.out.println(“Hello Lambda!”);
  • 格式二:有一个参数,无返回值(如果只有一个参数可以省略(),如果只有一条语法可以省略{})
    (x)->System.out.println(x);
  • 格式三:只有一个参数,小括号可以省略不写
    x -> System.out.println(x);
  • 格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
    Comparator com = (x, y) -> {System.out.println(“函数式接口”);return Integer.compare(x, y);};
  • 格式五:如果 Lambda 体中只有一条语句, return和大括号都可以省略不写
    Comparator com = (x, y) -> Integer.compare(x, y);
  • 格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出数据类型,即“类型推断”
    (Integer x, Integer y) -> Integer.compare(x, y);

1.2. ::关键字

Java 8 中我们可以通过 :: 关键字来访问类的构造方法,对象方法,静态方法。
比如静态方法的引用String::valueOf,可以代替x->String.valueOf(x)
比如构造器的引用ArrayList::new,可以代替x->new ArrayList(x)
比如对象方法的引用Student::getId,可以代替x->x.getId()

Stream.of(1,2,3,4,5,6,8,9,0).collect(Collectors.toCollection(ArrayList::new));

1.3 使用与分类

加上@FunctionalInterface就可以将一个函数变为函数式接口
函数式接口也就只分为 Function、Operator、Consumer、Predicate、Supplier 这五大类。
Consumer:定义了一个accept()的抽象方法,它接收泛型T的对象,没有返回(void)。简单来说就是:接收一个输入参数,不返回结果。
Function:定义了一个apply()方法,它接收一个泛型T的对象,并返回一个R对象。一句话解释就是:输入一个参数,返回一个结果。
BitFunction:一句话总结就是:接收两个参数,得到一个结果。
Predicate:一句话解释就是:接收一个参数,返回一个布尔值。
Supplier:一句话解释就是:不接收任何参数,返回一个结果。
BinaryOperator:接收两个相同类型的参数,返回一个结果。

2. Stream:

https://www.jianshu.com/p/11c925cdba50:一、操作符简介
https://www.jianshu.com/p/2338cabc59e1:二、函数式接口
https://www.jianshu.com/p/6ee7e4cd5314:三、collect收集器
https://www.jianshu.com/p/461429a5edc9:四、intStream
https://www.jianshu.com/p/487cb3d61d9c:五:streamTrace

Steam分为①创建Stream;②中间操作;③终止操作。终止操作后可以再接一个forEach。

猜你喜欢

转载自blog.csdn.net/kittyzc/article/details/106034266