Java8 新特性 函数式接口
来源:互联网 发布:python zip函数 编辑:程序博客网 时间:2024/06/06 00:48
摘要: Java8在使用Lambda时,需要函数式接口的声明。如果每次使用Lambda表达式都自己编写函数式接口,那就违背了Lambda表达式设计的初衷——更加简洁的书写代码,也不利于新特性的推广,于是JDK的设计人员内置了四大核心函数式接口。
消费型接口Consumer< T >
语法:void accept(T t)
解读:接收一个参数,并且没有返回值
@Test public void testConsumer(){ study(6, (m -> System.out.println("买工具书花费" + m + "元"))); study(2, (m -> System.out.println("买铅笔花费" + m + "元"))); } public void study(double money, Consumer<Double> con){ con.accept(money); }
上面例子,讲述一个学生在学习过程中,需要买学习用品。买什么东西是具体的实现,我们在调用study()方法的时候再指定。
供给型接口Supplier< T >
- 语法:T get()
- 解读:提供特定的对象,没有参数
public static List<Student> students = Arrays.asList( new Student(1, "Aim", 12, 78), new Student(2, "Bob", 15, 45), new Student(3, "Cicy", 13, 89), new Student(4, "Deny", 11, 91), new Student(5, "Emiy", 14, 32) ); @Test public void testSupplier(){ List<Student> stuList = getStuList(3, () -> students.get((int)(Math.random()*4) + 1)); System.out.println(stuList); } /** * * @param num 需要多少学生信息 * @param sup 怎么去筛选需要的学生信息 * @return list 学生集合 */ public List<Student> getStuList(int num, Supplier<Student> sup){ List<Student> list = new ArrayList<>(); for (int i = 0; i < num; i++) { Student s = sup.get(); list.add(s); } return list; }
上面这个例子,模拟老师随机点名,这次需要三位同学打扫卫生,使用Supplier来生成对应的学生信息。
函数型接口Function< T, R >
- 语法:R apply(T t)
- 解读:对参数T做一定的操作,返回R型的数据
/** * 对学生改名字,将Aim改为Anny */ @Test public void testFunction(){ String newName = studentUpdate(students.get(0), (s) -> {s.setName("Anny"); return s.getName();}); System.out.println(newName); } /** * * @param 学生对象 * @param 要做什么处理,在调用该方法的时候指定 * @return */ public String studentUpdate(Student s, Function<Student,String> fun){ return fun.apply(s); }
这里的studentUpdate()接受一个student参数,做一定的处理之后,返回一个string类型的值。例如更改一个学生的名字,打印更改以后的名字。当然最好可以返回学生对象,这样就可以更改年龄、得分之类的信息。
断言型接口Predicate< T >
- 语法:boolean test(T t)
- 解读:Predicate 接口只有一个参数,返回boolean类型。
/** * 把学生成绩大于60的学生信息打印输出 */ @Test public void testPredicate(){ List<Student> filterStudent = filterStudent(students, (s) -> s.getScore() >= 60); filterStudent.stream().forEach(System.out::println); } /** * * @param 学生集合list * @param 需要做何种判断 * @return 符合条件的学生集合list */ public List<Student> filterStudent(List<Student> list, Predicate<Student> pre){ List<Student> l = new ArrayList<>(); for(Student s : list){ if (pre.test(s)) { l.add(s); } } return l;}
这里的filterStudent()函数可以过滤通过一些条件过滤某些信息,过滤条件在调用的时候指定。可以把学生成绩大于60的学生信息打印输出,也可以把学生年龄大于15的学生信息打印输出.
其他接口
这些基本的接口已经实现大部分我们的需求,此外,还有一些子接口,虽然不常用,但是在某些场景下可以方便我们定义自己的功能。
阅读全文
0 0
- Java8新特性函数式接口
- Java8 新特性 函数式接口
- Java8 新特性之一---------Lambda表达式和函数式接口
- Java8新特性之 函数式接口FunctionalInterface详解
- Java8新特性Lambda表达式、函数式接口
- JAVA8新特性[第二季]-函数式接口
- Java8新特性之四函数式接口
- Java8新特性_四大内置核心函数式接口
- JAVA8新特性之(函数式接口)
- Java8新特性(内置的核心函数式接口)
- [Java]Java8新特性-lambda表达式/语法/函数式接口
- Java8:接口新特性
- 【java8新特性】关于接口
- JAVA8新特性 函数式编程Lambda
- java8新特性 函数式编程 Lamda
- JAVA8新特性(二)——通用函数接口
- JAVA8新特性总结一(接口函数默认实现)
- java8新特性回顾(一)---函数式接口和lamda表达式
- Mysql使用索引和不使用索引场景
- 设计模式之观察者模式
- MVC框架的EF删除
- 操作系统基本概念(转)
- 《Java编程思想-持有对象》
- Java8 新特性 函数式接口
- FFMPEG结构体分析:AVPacket
- 总结1-我跟书华大佬写的代码的区别
- 查找——树表的查找
- 关于 tomcat启动startup.bat一闪而过的问题
- mybatis逆向生成映射文件实体类 单元测试test 增删改查方法
- 413. Arithmetic Slices
- crack the coding interview 数组与字符串 1.2
- win7+ubuntu安装