在我们日常的开发过程中,避免不了会写一点简单的函数,比如说,将每个人的年龄乘以二返回,判断年龄是否大于18等等,若是每次碰到这种的问题,我们都去写一个函数的话,好像是有点麻烦的,但是在java8中,将这些函数全部封装了,大概分为如下四种
名称 | 描述 | 对应的方法 | 入参(类型) | 出参(类型) |
---|---|---|---|---|
Function<S,T> | 功能型 | apply | Y<S> | Y(T) |
Consumer<S> | 消费者型 | accept | Y<S> | N |
Supplier<R> | 申请型 | get | N | Y<S> |
Predicate<T> | 判断型 | test | Y<T> | Y<bool> |
示例
Function
-
使用场景: 通过输入某一个值,在处理后也需要返回对应的结果值
-
接受类型为String
-
返回类型为Integer
Function<String, Integer> function = s ->{
return 1;
};
System.out.println (function.apply ("200"));
Consumer
-
使用场景:通过输入某种值,不在意返回结果,一般多数用于流式计算
-
接受类型为String
-
没有返回值
Consumer<String> consumer = s -> {
System.out.println (s + "22");
};
consumer.accept ("dasdsa");
Supplier
-
使用场景:没有入参,但是希望获取到某种返回值,一般多用于获取某种池化资源,比如说获取jedis的连接,数据库的连接等等
-
不需要接受参数
-
返回的类型为String
Supplier<String> supplier = () -> {
return "wew";
};
System.out.println (supplier.get ());
Predicate
-
使用场景:接受一个String类型的参数,将这个参数进行了逻辑运算,最后的需要给返回一个 0/1 的逻辑值,比如是在判断某个学生的年纪是否大于14等等
-
接受的类型为String
-
返回的类型永远都是bool
Predicate<String> predicate = s -> {
return s.length () > 0;
};
System.out.println (predicate.test ("ewe"));
上述的这些看起来好像有点太简单了,那我们来点高级的吧
给出如下代码片段,打印出年龄>=18,性别是'女',的人的id或者名字并返回一条
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1, "张三", 10, "男"));
studentList.add(new Student(2, "李四", 7, "男"));
studentList.add(new Student(3, "西施", 20, "女"));
studentList.add(new Student(4, "貂蝉", 18, "女"));
解题思路
-
循环list过滤出年龄 >= 18 得到集合 list1
-
循环list1,过滤出性别='女' 得到集合list2
-
循环打印出list2
大致代码如下
List<Student> list1 = new ArrayList<>(); for (Student student : studentList){ if (student.getAge() >= 18){ list1.add(student); } } List<Student> list2 = new ArrayList<>(); for (Student student : list1){ if ("女".equals(student.getSex())){ list2.add(student); } } System.out.println(list2.get(0));
好像看起来有点多,并且有很多比较重复的代码,但是总体的逻辑是比较清晰的,没啥毛病, 那么有没有一种优化的写法呢???
优化版本
这里考虑通过上述的jdk提供的方法几种方法,具体的代码如下
String studentName = studentList.stream()
.filter(x -> x.getAge() >= 18)
.filter(x -> "女".equals(x.getSex()))
.map(Student::getName)
.collect(Collectors.toList())
.get(0);
System.out.println(studentName);
代码经过一番改造,比起之前的版本要规整(优雅)了很多,在后续的代码中我们可以经常性的使用这种流式编程,可以大大的简单我们代码可读性。
在上述的几个函数中,分别接受如下的几个参数类型
- filter
public final Stream<P_OUT> filter(Predicate<? super P_OUT> predicate)
- map
public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper)
以上就是这次分享的内容,欢迎大家一起交流与探讨~~~
网友评论