这里写目录标题
5.1 筛选和切片
[Q&A] java8 什么是筛选?
在Java 8中,"筛选"指的是使用Stream API中的操作来根据特定条件从数据集中挑选出满足这些条件的元素。
5.1.1 用谓词筛选(filter
)
Stream<T> filter(Predicate<? super T> predicate);
# 基础用法演示
List<Dish> vegetarianMenu = menu.stream()
.filter(Dish::isVegetarian) ← 方法引用检查菜肴是否适合素食者
.collect(toList());
# 收集多个流的数据
List<Integer> list22 = new ArrayList<>();
Arrays.stream("1,2,3,4,5".split(",")).mapToInt(Integer::parseInt).max().ifPresent(list22::add); // [5]
Arrays.stream("1,2,3,4,6".split(",")).mapToInt(Integer::parseInt).max().ifPresent(list22::add); // [5,6]
# 收集单个流的数据
List<String> list55 = list.stream().filter(Objects::nonNull).map(Person::getName).collect(Collectors.toList()); // [John]
最佳实践:收集对象属性 nonNull
isNotBlank
# nonNull
# isNotBlank
List<String> collect = list.stream()
.filter(Objects::nonNull)
.map(Person::getName)
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.toList());
最佳实践:最安全使用list.stream
的方式
List<String> collect = Optional.ofNullable(list)
.orElse(new ArrayList<>())
.stream()
.map(Person::getName)
.collect(Collectors.toList());
5.1.2 筛选各异的元素(distinct
)
去重( 根据流所生成元素的hashCode
和equals
方法实现)
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
numbers.stream()
.filter(i -> i % 2 == 0)
.distinct()
.forEach(System.out::println);
[Q&A] java8 什么是切片?
在Java 8中,"切片"通常是指使用Stream API来获取一个集合(如List)的子集。
5.1.3 截短流(limit
)
取前n项,如果不够n就有多少取多少。
Stream<T> limit(long maxSize);
List<Dish> dishes = menu.stream()
.filter(d -> d.getCalories() > 300)
.limit(3)
.collect(toList());
5.1.4 跳过元素(skip
)
跳过前n个元素的流。如果流中元素不足n个,则返回一个空流。
Stream<T> skip(long n);
List<Dish> dishes = menu.stream()
.filter(d -> d.getCalories() > 300)
.skip(2)
.collect(toList());
# 获取第四条数据
Integer integer = list.stream().sorted(Comparator.reverseOrder()).skip(3).limit(1).findFirst().orElse(0); // 1
list.stream().sorted(Comparator.reverseOrder()).skip(3).limit(1).forEach(System.out::println); // 1