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

时间:2017-07-20 19:22:51

标签: java java-8

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

以下是我尝试使用流API:

这将区分结果,但不是空

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

我如何将它们组合在一起?

2 个答案:

答案 0 :(得分:7)

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

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

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

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

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

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

或者两次致电filter

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

答案 1 :(得分:3)

users.stream().map(User::getTitle).distinct().filter(s -> !s.isEmpty()).collect(Collectors.toList());