java中集合和if else语句的优化使用

lrl1mhuk  于 2023-05-15  发布在  Java
关注(0)|答案(3)|浏览(135)

我有一个下面的代码,这是预期的工作,我想优化它,可能如果使用流的方法。

List<List<String>> colorsList = List.of(
   List.of("red","maroon"),
   List.of("blue, skyblue"),
   List.of("pink"));

int var1 = 5;
List<String> listReturn = new ArrayList<>();

for(List<String> innerList: colorsList){
    if(var1 == 5){
        if(innerList.contains("blue")){
            listReturn.addAll(innerList);
        }
    }else if(var1 == 10){
        if(innerList.contains("pink") || innerList.contains("red")){
            listReturn.addAll(innerList);
        }
    }
  }
}

基本上我返回一个单一的列表listReturn组合1或多个列表从原始colorsList的基础上的条件。有没有一个更好的和优化的方式来写上面?

epfja78i

epfja78i1#

你可以参考下面的代码,你还应该检查colorsList是否为null

List<List<String>> colorsList = List.of(
        List.of("red","maroon"),
        List.of("blue", "skyblue"),
        List.of("pink"));

int var1 = 5;
List<String> listReturn = new ArrayList<>();

if (5 == var1) {
    colorsList.stream()
            .filter(innerList -> innerList.contains("blue"))
            .forEach(listReturn::addAll);
} else if (10 == var1) {
    colorsList.stream()
            .filter(innerList -> innerList.contains("pink") || innerList.contains("red"))
            .forEach(listReturn::addAll);
}
j13ufse2

j13ufse22#

如果我想写这段代码,我将首先创建一个colorsList流,然后过滤它。如果筛选条件为true,则该项将添加到输出中。接下来,我们使用flatMap()将嵌套列表扁平化为单个字符串流。

List<String> listReturn = colorsList.stream()
        .filter(innerList -> var1 == 5 && innerList.contains("blue")
                || var1 == 10 && (innerList.contains("pink") || innerList.contains("red")))
        .flatMap(Collection::stream)
        .collect(Collectors.toList());
kqlmhetl

kqlmhetl3#

你可以分解出 predicate ,这样你就不必重复检查和过滤列表的代码:

List<List<String>> colorsList = List.of(
        List.of("red","maroon"),
        List.of("blue, skyblue"),
        List.of("pink"));

int var1 = 5;

// switch expression
Predicate<List<String>> predicate = switch (var1) {
    case 5 -> innerList -> innerList.contains("blue");
    case 10 -> innerList -> innerList.contains("pink") || innerList.contains("red");
    default -> innerList -> true; // if something else than 5 or 10 accept all
};

List<String> listReturn = colorsList.stream()
               .filter(predicate).flatMap(List::stream).toList();

相关问题