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

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

去重( 根据流所生成元素的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);

[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
  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以,以下是一些 Java 8 Stream API 常用方法的代码例子: 1. filter: List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); 2. map: List<String> words = Arrays.asList("hello", "world"); List<Integer> wordLengths = words.stream() .map(String::length) .collect(Collectors.toList()); 3. flatMap: List<List<Integer>> numbers = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6)); List<Integer> flattenedNumbers = numbers.stream() .flatMap(List::stream) .collect(Collectors.toList()); 4. distinct: List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 4, 5, 3); List<Integer> distinctNumbers = numbers.stream() .distinct() .collect(Collectors.toList()); 5. sorted: List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5); List<Integer> sortedNumbers = numbers.stream() .sorted() .collect(Collectors.toList()); 6. peek: List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> doubledNumbers = numbers.stream() .peek(n -> System.out.println("Doubling " + n)) .map(n -> n * 2) .collect(Collectors.toList()); 7. limit: List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> limitedNumbers = numbers.stream() .limit(3) .collect(Collectors.toList()); 8. skip: List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> skippedNumbers = numbers.stream() .skip(2) .collect(Collectors.toList()); 9. reduce: List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .reduce(0, Integer::sum); 10. collect: List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> collectedNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList());

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值