java8 筛选和切片方法(`filter`)(`distinct`)(`limit`)(`skip`)

5.1 筛选和切片

5.1.1 用谓词筛选(filter

Streams接口支持filter方法。该操作会接受一个谓词作为参数,并返回一个包括所有符合谓词的元素的流。

Stream<T> filter(Predicate<? super T> predicate);
List<Dish> vegetarianMenu = menu.stream()
                                .filter(Dish::isVegetarian)    ← 方法引用检查菜肴是否适合素食者
                                .collect(toList());

收集对象属性最佳实践 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());
# 收集符合条件的值
List<Integer> list22 = new ArrayList<>();
Arrays.stream("1,2,3,4,5".split(",")).mapToInt(Integer::parseInt).max().ifPresent(list22::add); // [5]
        
List<String> list33 = new ArrayList<>();
Arrays.stream("a,b,c,a,a,a".split(",")).filter("a"::equals).findAny().ifPresent(list33::add); // [a]
        
List<String> list44 = new ArrayList<>();
Arrays.stream("a,b,c,a".split(",")).filter("a"::equa=-).findFirst().ifPresent(list44::add); // [a]
        
List<Person> list = new ArrayList<>();
list.add(new Person("John", 18, "1234567"));
List<String> list55 = list.stream().filter(Objects::nonNull).map(Person::getName).collect(Collectors.toList()); // [John]

5.1.2 筛选各异的元素(distinct

流还支持一个叫作distinct的方法,它会返回一个元素各异( 根据流所生成元素的hashCodeequals方法实现)的流。

List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
numbers.stream()
       .filter(i -> i % 2 == 0)
       .distinct()
       .forEach(System.out::println);

5.1.3 截短流(limit

流支持limit(n)方法,取前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

流还支持skip(n)方法,跳过前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

你可能感兴趣的:(JAVA8,windows,python,linux)