Lambda表达式

Lambda表达式

Predicate操作  Predicate<T>接口 返回一个boolean类型的结果。

Java8为Collection集合新增一个removeIf(Predicate filter)方法,该方法将会批量删除符合filter条件的元素。该方法需要Predicate对象作为参数,Predicate对象也是函数式接口,因此可以使用Lambda表达式作为参数。

实例一:

 1  @Test
 2     public void filterList() {
 3         List<Car> carList = Lists.newArrayList();
 4         for (int i = 0; i< 100; i++){
 5             Car car = new Car("red" + i, "JiLi" + i);
 6             carList.add(car);
 7         }
 8         //移除carList中Car对象颜色长度大于5的元素
 9         carList.removeIf(o -> o.getColor().length() > 5);
10         carList.forEach(System.out::print);
11     }
12 
13 import lombok.AllArgsConstructor;
14 import lombok.Builder;
15 import lombok.Data;
16 import lombok.NoArgsConstructor;
17
18 @Data
19 @NoArgsConstructor
20 @AllArgsConstructor
21 @Builder
22 public class Car {
23 
24     private String color;
25 
26     private String type;
27 }

Predicate用法的示例:

 1 @Test
 2     public void filterList() {
 3         List<Car> carList = Lists.newArrayList();
 4         for (int i = 0; i < 100; i++) {
 5             Car car = new Car("red" + i, "JiLi" + i);
 6             carList.add(car);
 7         }
 8         //统计carList中Car对象类型长度小于6的元素个数
 9         log.info("Car类型字符长度小于6个数:{}", filterDiffType(carList, o -> ((Car) o).getType().length() < 6));
10         log.info("Car类型以0结尾的个数:{}", filterDiffType(carList, o -> ((Car) o).getType().endsWith("0")));
11     }
12 
13     private int filterDiffType(List<Car> carList, Predicate predicate) {
14         int count = 0;
15         for (Car car : carList) {
16             if (predicate.test(car)) {
17                 count++;
18             }
19         }
20         return count;
21     }

Stream流操作

Java8新增了Stream,IntStream,LongStream,DoubleStream等流式API,这些API代表多个支持串行和并行聚集操作的元素。

 1  @Test
 2     public void streamtest() {
 3         IntStream stream = IntStream.builder()
 4                 .add(90)
 5                 .add(85)
 6                 .add(98).build();
 7         OptionalDouble d = stream.average();
 8         System.out.println(d.orElse(2));
 9         OptionalInt in = OptionalInt.empty();
10         System.out.println(in.orElse(10));
11     }

Stream的中间方法:中间操作允许流保持打开状态,并允许直接调用后续方法。中间方法返回值是另外一个流。

Stream的末端方法:末端方法时对流的最终操作。对某stream执行末端方法后,该流将会被消耗且不可再使用。

Stream的中间方法:

filter(Predicate predicate) 过滤Stream中所有不符合predicate的元素。

mapToXxx(ToXxxFunction mapper) 使用ToXxxFunction对流的元素执行一对一的转换,该方法返回的新流中包含了ToXxxFunction转换生成的所有元素。

peek(Consumer action) 依次对每个元素执行一些操作,该方法返回的流与原来流包含相同的元素。

distinct() 该方法用于排序流中所有重复的元素。

sorted()该方法用于保证流中的元素在后续的访问中处于有序状态。

limit(long maxSize) 该方法用于保证对该流的后续访问中最大允许访问的元素个数。

Stream的末端方法:

forEach(Consumer action)遍历流中所有的元素

toArray()将流中所有元素转换成为一个数组。

reduce()该方法该方法有三个重载版本,用于通过某种操作来合并流中的元素。

min()返回流中所有元素的最小值

max()返回流中所有元素的最大值

count()返回流中所有元素的数量。

anyMatch(Predicate predicate) 判断流中是否至少包含一个元素符合predicate条件

allMatch(Predicate predicate)

nonMatch(Predicate predicate)

findFirst()返回流中的第一个元素

findAny()返回流中的任意一个元素

实例:使用Stream对实例一改下

 1  @Test
 2     public void filterList() {
 3         List<Car> carList = Lists.newArrayList();
 4         for (int i = 0; i < 100; i++) {
 5             Car car = new Car("red" + i, "JiLi" + i);
 6             carList.add(car);
 7         }
 8         //统计carList中Car对象类型长度小于6的元素个数
 9         long count = carList.stream().filter(o -> o.getType().length() < 6).count();
10         log.info("Car类型字符长度小于6个数:{}", count);
11         long count2 = carList.stream().filter(o -> o.getType().endsWith("0")).count();
12         log.info("Car类型以0结尾的个数:{}", count2);
13         carList.stream().filter(o -> o.getType().length() < 6).map(o -> o.getColor().concat("-blue-")).forEach(System.out::print);
14     }

 

posted @ 2020-04-03 11:10  seedss  阅读(161)  评论(0编辑  收藏  举报