我编写了一个小的方法,该方法可以接收字符串并将字符串与enum
属性进行比较。如果匹配,我将返回特定的enum
。这是工作代码。
public static ScreenPlay getAct(String text) {
ScreenPlay act = null;
for (ScreenPlay aAct : ScreenPlay.values()) {
for (String code : aAct.code) {
if (StringUtils.contains(text, code)) {
act = aAct;
break;
}
}
if (act != null) {
break;
}
}
return act;
}
我想知道这些是否可以使用lambda重写?任何帮助将不胜感激。
更新:
以下是我的尝试:
Arrays.stream(ScreenPlay.values())
.forEach(a -> a.code.stream()
.filter(code -> StringUtils.contains(text, code))); // not sure how to get Optional of ScreenPlay
答案 0 :(得分:2)
您正在寻找filter
和findFirst
:
Optional<ScreenPlay> act = Arrays.stream(ScreenPlay.values())
.filter(aAct -> Arrays.stream(aAct.code)
.anyMatch(code -> StringUtils.contains(text, code))
.findFirst();
答案 1 :(得分:2)
forEach是一个终端操作,不返回任何内容。结果,您需要的是一个Optional:与谓词匹配的第一个ScreenPlay(如果存在)。
因此代码应为
Optional<ScreenPlay> result = stream.filter(screenPlay -> shouldAccept(screenPlay, text))
.findFirst();
现在,您想实现shouldAccept(ScreenPlay, String text)
方法。如果screenPlay至少有一个包含文本的代码,则此方法应返回true(反之亦然,这取决于您的StringUtils.contains()
方法的作用。
有一种流方法:anyMatch():
boolean shouldAccept(ScreenPlay screenPlay, String text) {
return screenPlay.codes.stream().anyMatch(code -> StringUtils.contains(text, code));
}
当然,您可以根据需要内联此方法。注意良好的命名方式(screenPlay代替aAct,代码代替代码,代码代替act)使代码更具可读性。