Java版本特性 - jdk8
1. stream + lambda 操作集合数据
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
前往 demo文件
1.1. 概念
1.1.1. Stream的运作流程
- stream不会改变原有数据,而是创建一条新的数据。
案例:
1 2
| List<Integer> datas = Lists.newArrayList(1, 2, 3); List<Integer> nums = datas.stream().filter(a -> a == 2).collect(Collectors.toList());
|
datas.stream() –> 将集合datas转换为stream类型。
.filter() –> 过滤不需要的数据。
.collect() –> 构建出新结构的数据。
1.2. 初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| int[] num = {1}; IntStream arrayStream = Arrays.stream(num);
Stream<Integer> integerStream = Stream.of(2, 2);
List<Integer> list = Lists.newArrayList(3, 3, 3); Stream<Integer> collectionStream = list.stream();
Stream<Integer> generateStream = Stream.generate(() -> 4).limit(4);
Stream<Integer> iterateStream = Stream.iterate(5, a -> a).limit(5);
Stream<Object> buildStream = Stream.builder().add(1).build();
Stream<Object> emptyStream = Stream.empty();
|
1.3. API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| List<Integer> datas = Lists.newArrayList(1, 2, 2, 3);
datas.stream().forEach(a -> System.out.println(a));
datas.stream().forEachOrdered(a -> System.out.println(a));
datas.stream().filter(a -> a == 2).forEach(a -> System.out.println(a));
datas.stream().map(a -> (a * 5) + "a").forEach(a -> System.out.println(a));
datas.stream().distinct().forEach(a -> System.out.println(a));
datas.stream().sorted(Comparator.naturalOrder()).forEach(a -> System.out.println(a));
datas.stream().peek(a -> System.out.println(a)).filter(a -> a == 2) .forEach(a -> System.out.println(a));
datas.stream().limit(2).forEach(a -> System.out.println(a));
datas.stream().skip(1).forEach(a -> System.out.println(a));
Object[] objects = datas.stream().toArray();
Integer integer = datas.stream().reduce((a, b) -> a + b).get();
Set<Integer> collect = datas.stream().collect(Collectors.toSet());
Integer minNum = datas.stream().min(Comparator.naturalOrder()).get();
Integer maxNum = datas.stream().max(Comparator.naturalOrder()).get();
long count = datas.stream().count();
boolean anyMatch = datas.stream().anyMatch(Predicate.isEqual(1));
boolean allMatch = datas.stream().allMatch(Predicate.isEqual(2));
boolean noneMatch = datas.stream().noneMatch(Predicate.isEqual(3));
Integer findFirst = datas.stream().findFirst().get();
Integer findAny = datas.stream().findAny().get();
List<int[]> datas2 = Lists.newArrayList(new int[]{1, 2}, new int[]{3, 4}, new int[]{5, 6});
datas2.stream().flatMapToInt(a -> Arrays.stream(a)).forEach(a -> System.out.println(a));
|
1.4. 案例
1.4.1. 基于时间排序
升序
1 2
| users.sort(Comparator.comparing(User::getCreatedOn)); 1
|
降序
1
| users.sort(Comparator.comparing(User::getCreatedOn).reversed());
|