- lamdad表达式函数式接口方法引用构造器引用StreamAPI接口中的默认方法与静态方法新时间日期API其它特性
提示:为什么学习lamdad表达式?能帮我们解决什么问题?值不值得学习?
public void test() {
//之前的内部类
Comparator com = new Comparator() {
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
};
System.out.println("如果是lamdad表达式的写法----------------------------------------------");
Comparator com2= (o1,o2)-> Integer.compare(o1.length(), o2.length());
}
提示:找出符合条件的用户(年龄大于30. 薪资大于5000的, id 大于3)
Listusers = Arrays.asList( new User(1,"张三",15,2000.00), new User(2,"李四",20,3000.00), new User(3,"王五",30,5900.00), new User(4,"赵六",35,6600.00), new User(5,"田七",45,7700.00)); //获取年龄小于35的用户? public List filteByAge(List users) { List temp = new ArrayList<>(); for(User user : users){ if(user.getAge()>35) { temp.add(user); } } return temp; } //获取工资大于5000的用户? public List filteBySalary(List users) { List temp = new ArrayList<>(); for(User user : users){ if(user.getSalary()>35) { temp.add(user); } } return temp; } //获取id大于2的数据 //... //优化方式1,策略设计模式 public List filterByPredicate(List users, MyPredicate predicate) { List temp = new ArrayList<>(); for(User user : users){ if(predicate.judge(user)) { temp.add(user); } } return temp; } public void test1() { List users = filterByPredicate(this.users, new MyPredicateByAge()); } //优化方式2,匿名内部类 public void test2() { List users = filterByPredicate(this.users, new MyPredicate () { @Override public boolean judge(User user) { return user.getAge()>35; } }); } //优化方式3 lamdad表达式 public void test3() { List users = filterByPredicate(this.users, user->user.getAge()>35); } //优化方式4 public void test4() { List users = users.stream().filter(user->user.getAge()>35).collect(Collectors.toList()); }
- 通过写不同的方法通过策略模式写不同的类通过策略模式写匿名内部类通过策略模式lamdad表达式通过Stream API (现成的方法)
提示:通过java8的新特性lamdad表达式和streamapi变得很简单
lamdad表达式:
提示:lamdad表达式无非就是简化代码
Comparatorcom2= (o1,o2)-> Integer.compare(o1.length(), o2.length());
定义: lamdad表达式:左侧 ->右侧
左侧定义参数列表右侧具体实现lamdad表达式需要函数式接口支持
函数式接口:
提示:接口中只有一个抽象方法的接口,称为函数式接口,可以使用@FunctionalInterface注解,来说明该接口是函数式接口,当然java8的接口做了升级,可以允许有静态方法和默认方法,来增强接口
例如:
@FunctionalInterface
public interface MathOperation {
float operator(int a, int b);
}
四种内置函数式接口
@FunctionalInterface public interface Consumer方法引用:{ void accept(T t); @FunctionalInterface public interface Supplier { T get(); } @FunctionalInterface public interface Function { R apply(T t); @FunctionalInterface public interface Predicate { boolean test(T t);
提示:其实质就是对lamdad表达式的简化,方法体只是一个方法的调用
使用前提:若lamdad体实现的功能,已经有方法提供了实现,可以使用方法引用
- 对象的引用::实例方法名
PrintStream ps = System.out; Consumercon = x-> ps.println(x); Consumer co2 = x-> ps::println;
- 类名::静态方法名
Comparatorcom1= (o1,o2)-> Integer.compare(o1,o2); Comparator com2= Integer::compare;
- 类名::实例方法名
BiPredicatebp = (x,y)->x.equals(y); BiPredicate b2 = String::equals;
提示:方法引用注意:1:方法引用的方法参数列表与返回类型必须与函数式接口中抽象方法的参数列表与返回类型必须一致。2返回类型相同的情况下,函数接口中的抽象方法的参数列表的第一个参数是方法引用方法的调用者,第二个参数(或无参),是方法引用方法的参数时,可以使用类名:实例方法名
构造器引用:提示:跟引用类似 类名::new
Supplieruser = ()-> new User(); Supplier use2 = User::new;



