用Java 8 lambda

时间:2018-07-10 11:55:39

标签: lambda java-8

我编写了一个小的方法,该方法可以接收字符串并将字符串与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

2 个答案:

答案 0 :(得分:2)

您正在寻找filterfindFirst

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)使代码更具可读性。