lambda和steam经典总结 下载本文

内容发布更新时间 : 2024/7/3 12:31:42星期一 下面是文章的全部内容请认真阅读。

λ表达式本质上是一个匿名方法,它可以自动实现接口中的唯一方法,这个接口一般用@FunctionalInterface标注出来(也可以不标),java8引入lambda表达式和stream可以实现函数式编程。

实现函数式接口的例子有Runnable,Callable,Comparable,java8中新加入了Function,Predicate,Consumer,Supplier。 函数式编程的核心 ?

声明式的代码风格(Declarative Style) : 这需要提高代码的抽象层次,比如在前面的例子中,将从集合中搜索一个元素的操作封装到contains方法中。

?

更多的不变性(Promote Immutability) : 能不声明变量就不要声明,需要变量时尽量使用final来修饰。因为变量越多,就意味着程序越难以并行。实现了不变性的方法意味着它不再有副作用,不会因为调用而改变程序的状态。

?

使用表达式来代替语句(Prefer Expression to Statement) : 使用语句也就意味着不变性的破坏和程序状态的改变,比如赋值语句的使用。

?

使用高阶函数(High-Order Function) : 在Java 8以前,重用是建立在对象和类型系统之上。而Java 8中则将重用的概念更进一步,使用函数也能够实现代码的重用。所谓高阶函数,不要被其名字唬住了,实际上很简单:

o o o

将函数作为参数传入到另外一个函数中 函数的返回值可以是函数类型 在函数中创建另一个函数

函数式编程例子1: prices.stream()

.filter(price -> price.compareTo(BigDecimal.valueOf(20))>0) .map(price -> price.multiply(BigDecimal.valueOf(0.9))) .reduce(BigDecimal.ZERO, BigDecimal::add);

一、lambda表达式

1.自定义函数式接口(也可以直接使用java8自带函数式接口)

@FunctionalInterface

public interface LambdaInterface { int add(int i, int j); }

2、将函数式接口作为参数的方法和类

public class LambdaUse{ private Integer age; private String name;

public String getName() { return name; }

public void setName(String name) { this.name = name; }

public Integer getAge() { return age; }

public void setAge(Integer age) {

this.age = age; }

public LambdaUse(int age, String name) { this.age = age; this.name = name; }

public LambdaUse() { }

public int getAdd(LambdaInterface lambdaInterface) { return lambdaInterface.add(5, 6); } }

3.测试

public class TestClass { @Test

public void lambdaTest() {

LambdaUse lambdaUse = new LambdaUse();

System.out.println(lambdaUse.getAdd((i, j) -> {return i + j;})); } @Test

public void foreachTest() {

String[] atp = {\, \, \, \,\,