根据优先级从列表中过滤值

use*_*342 11 java java-8

我有一个类型的有效值的列表:

Set<String> validTypes = ImmutableSet.of("TypeA", "TypeB", "TypeC");
Run Code Online (Sandbox Code Playgroud)

我想从给定的列表中提取具有有效类型的第一个值。在这种情况下,我会写这种东西:

public class A{
    private String type;
    private String member;
}

List<A> classAList;
classAList.stream()
    .filter(a -> validTypes.contains(a.getType()))
    .findFirst();
Run Code Online (Sandbox Code Playgroud)

但是我想优先考虑TypeA,例如,如果classAListTypeATypeB,我想要有的对象typeA。为此,我要做的是:

Set<String> preferredValidTypes = ImmutableSet.of("TypeA");
classAList.stream()
    .filter(a -> preferredValidTypes.contains(a.getType()))
    .findFirst()
    .orElseGet(() -> {
        return classAList.stream()
        .filter(a -> validTypes.contains(a.getType()))
        .findFirst();
    }
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法?

Adr*_*ian 4

按类型过滤列表,按类型排序,收集到列表,然后只获取第一个元素

List<A> collect = classAList.stream()
                  .filter(a -> validTypes.contains(a.getType()))
                  .sorted(Comparator.comparing(A::getType))
                  .collect(Collectors.toList());
System.out.println(collect.get(0));
Run Code Online (Sandbox Code Playgroud)

  • 为什么“collect”只获取第一个元素?`已排序(...).findFirst` (3认同)
  • @Eugene ...和“sorted(X).findFirst()”是“min(X)”的低效变体。 (3认同)