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]
distinct
)流还支持一个叫作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);
limit
)流支持limit(n)方法,取前n项,如果不够n就有多少取多少。
Stream<T> limit(long maxSize);
List<Dish> dishes = menu.stream()
.filter(d -> d.getCalories() > 300)
.limit(3)
.collect(toList());
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