Aru*_*unM 4 java lambda java-8 java-stream
以下是我的课
public final class Test {
enum Animal {DOG,CAT};
enum COLOR {RED,YELLOW};
class Meaningless {
String animal,color;
}
public void filter(List<Meaningless> meaninglesses){
meaninglesses.stream()
.filter(meaningless -> {
try {
Animal.valueOf(meaningless.animal);
return true;
}catch(Exception e){
return false;
}
})
.filter(meaningless -> {
try {
COLOR.valueOf(meaningless.color);
return true;
}catch(Exception e){
return false;
}
})
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
}
filter方法的2次迭代实质上过滤掉了无效的枚举类型。如何从中删除重复的代码?该检查应该足够通用,以便isValidEnum在enum引入新的检查时不必更改。
理想情况下,我想做类似的事情
meaninglesses.stream()
.filter(meaningless -> isValidEnum(meaningless.animal,Animal.class))
.filter(meaningless -> isValidEnum(meaningless.color,COLOR.class))
Run Code Online (Sandbox Code Playgroud)
以下实用程序方法可以解决这个问题,
public static <E extends Enum<E>> boolean validateEnum(Class<E> clazz, String s) {
return EnumSet.allOf(clazz).stream().anyMatch(e -> e.name().equals(s));
}
Run Code Online (Sandbox Code Playgroud)
这是您的客户代码实际的外观,
boolean isValid = validateEnum(Animal.class, "DOG");
Run Code Online (Sandbox Code Playgroud)
最后,将其放回您的上下文,应该是这样的。
meaninglesses.stream()
.filter(meaningless -> validateEnum(Animal.class, meaningless.animal))
.filter(meaningless -> validateEnum(COLOR.class, meaningless.color))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)