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 }