如何使用stream api将两个过滤器应用于一个列表

Sam*_*and 2 java java-8

我想在列表中添加第二个过滤器,我想排除空字符串旁边的字符串列表中的副本.

以下是我尝试使用流API的方法:

这将区分结果,但不是空的

List<User> users = userService.getUsers(form.getId());
    List<String> positionNames = users.stream().map(User::getTitle).distinct().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我怎样才能将它们组合在一起?

Fed*_*ner 7

您可以使用filter仅保留非空字符串:

List<String> positionNames = users.stream()
    .map(User::getTitle)
    .distinct()
    .filter(s -> !s.isEmpty())
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

如果您不关心订单,收集到a Set将具有与使用相同的效果distinct():

Set<String> positionNames = users.stream()
    .map(User::getTitle)
    .filter(s -> !s.isEmpty())
    .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

编辑:如果null某些用户有标题,您可能还想将其过滤掉:

Set<String> positionNames = users.stream()
    .map(User::getTitle)
    .filter(s -> s != null && !s.isEmpty())
    .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

或者filter两次打电话:

Set<String> positionNames = users.stream()
    .map(User::getTitle)
    .filter(Objects::nonNull)
    .filter(s -> !s.isEmpty())
    .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

  • @Samarland如果字符串为null,则需要添加另一个过滤器,或将条件更改为`s!= null &&!s.isEmpty()`.但这不是问题的一部分. (2认同)