内容发布更新时间 : 2025/4/1 0:09:34星期一 下面是文章的全部内容请认真阅读。
λ表达式本质上是一个匿名方法,它可以自动实现接口中的唯一方法,这个接口一般用@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 = {\, \, \, \,\,