【问题标题】:Return matching enum when any matching value任何匹配值时返回匹配枚举
【发布时间】:2018-09-15 16:18:22
【问题描述】:

使用 Java Streams,我想返回匹配的枚举值或抛出异常。枚举值是具有不同长度的对象数组。 对于内部过滤,使用for 循环我已经实现了所需的行为,但是我怎样才能在那里使用流呢?

public enum Person {

cat1("abc"),
cat2("def", "gh1"),

private String[] dummy;

Person(String... dummy) {
        this.dummy = dummy;
}

    public static Person byVal(String val) {
        return Person.stream()
                .filter(x -> {
  here-----           for(String s1 : x.dummy) {
                        if(s1.equalsIgnoreCase(val)) {
                            return true;
                        }
                    }
                    return false;
                })
                .findFirst().
                orElseThrow(() -> new IllegalArgumentException("illegal value"));
    }

    public static Stream<Person> stream() {
        return Stream.of(values());
    }

}

【问题讨论】:

    标签: java performance stream java-stream


    【解决方案1】:

    可能会更干净一些:

    enum Person{
    
        cat1("abc"),
        cat2("def", "gh1");
    
        private static final  Set<Person> ALL = EnumSet.allOf(Person.class);
    
        private String[] dummy;
    
        Person(String... dummy) {
            this.dummy = dummy;
        }
    
        public static Person byVal(String val) {
    
            return ALL
                    .stream()
                    .filter(x -> Arrays.stream(x.dummy).anyMatch(y -> y.equalsIgnoreCase(val)))
                    .findAny()
                    .orElseThrow(() -> new IllegalArgumentException("Not found : " + val));
        }
    
    }
    

    【讨论】:

    • @NoviceUser 发生这种情况的唯一方法是声明 dog(null) 例如。控制枚举实例的是
    【解决方案2】:

    您可以这样做:

    Person.stream()
          .filter(x -> Arrays.stream(x.dummy)
                             .anyMatch(s -> s.equalsIgnoreCase(val)))
          .findFirst()
          .orElseThrow(() -> new IllegalArgumentException("illegal value"));
    

    【讨论】:

    • 每次values 被称为小猫就会死去
    • @Eugene 为什么?你能解释一下吗?
    • @FedericoPeraltaSchaffner values 返回一个数组,根据定义该数组是可变的,而枚举实例则不是,因此每次都通过clone 进行防御性复制
    • @FedericoPeraltaSchaffner 不不!谢谢你的新闻信,因为那个,你让我第二晚睡得很晚:)
    • @NoviceUser 没有什么“更好”的,只是如果你在不返回这个数组的情况下进行搜索,你可以缓存它们,而不是一直调用值。这是个人喜好,这是一个非常过早的优化开始
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多