如果filter为假,如何返回整个列表

时间:2019-01-31 06:43:34

标签: java arraylist collections java-8 java-stream

我有这个清单

List<String> lstStr = new ArrayList<>();
lstStr.add("1");
lstStr.add("2");
lstStr.add("3");
lstStr.add("4");
lstStr.add("5");

当我搜索字符串“ 1” 时,它应该返回List<String> = ["1"],如果搜索字符串不在列表中,例如“ 0” 应该返回整个List <String> =["1","2","3","4","5"]。可以使用java流实现吗?请显示一个示例。

我已经使用下面的代码尝试了此操作,但是当我搜索说“ “ 0”

时,我可以获得整个列表
List<String> filteredLst = lstStr.stream()
                                  .filter(data-> "1".equalsIgnoreCase(data))
                                  .collect(Collectors.toList());

filteredLst.forEach(data2 -> System.out.println(data2));

谢谢。

5 个答案:

答案 0 :(得分:2)

您可以对谓词进行分区并返回非空列表:

SHOW CREATE TABLE oc_xile_entity

Map<Boolean, List<String>> split = lstStr.stream() .collect(Collectors.partitioningBy("1"::equalsIgnoreCase)); List<String> filteredLst = split.get(Boolean.TRUE).isEmpty() ? split.get(Boolean.FALSE) : //can also use lstStr instead split.get(Boolean.TRUE); 将返回一个2项映射,其中Collectors.partitioningBy("1"::equals)是符合您的过滤条件的条目的键,而true是其余条目的键。

false应该包含映射到filteredLst的值(如果该值不为空),否则应包含true的值(肯定与原始列表相同)

答案 1 :(得分:2)

如果您不需要处理重复项,则可以执行以下操作:

static List<String> getOneOrAll(List<String> list, String element) {
    return list.stream()
               .filter(element::equalsIgnoreCase)
               .findFirst()
               .map(Collections::singletonList)
               .orElse(list);
}

...
List<String> result = getOneOrAll(lstStr, "1");

否则,您可以传入谓词并过滤重复项:

static <T> List<T> getOneOrAll(List<T> list, Predicate<T> predicate) {
    List<T> filteredList = list.stream()
                               .filter(predicate)
                               .collect(toList());
    return filteredList.isEmpty() ? list : filteredList;
}

...
List<String> result = getOneOrAll(lstStr, "1"::equals);
// or
List<String> resultIgnoringCase = getOneOrAll(lstStr, "1"::equalsIgnoreCase);

答案 2 :(得分:1)

为此可能使用的简单util将使用contains

List<String> findAndReturnValue(List<String> lstStr, String value) {
    return lstStr.contains(value) ? Arrays.asList(value) : lstStr;
}

,以及列表中可能的重复项:

List<String> findAndReturnValue(List<String> lstStr, String value) {
    return lstStr.contains(value) ?
            lstStr.stream()
                    .filter(a -> a.equalsIgnoreCase(value)) // condition as in question
                    .collect(Collectors.toList()) : lstStr;
}

要减少元素在列表中出现的情况的复杂性,一种较为简单的解决方案是将其收集到列表中,然后检查大小:

List<String> findAndReturn(List<String> lstStr, String value) {
    List<String> filteredLst = lstStr.stream()
            .filter(data -> data.equalsIgnoreCase(value))
            .collect(Collectors.toList());
    return filteredLst.isEmpty() ? lstStr : filteredLst;
}

答案 3 :(得分:0)

您可以为此使用自定义收集器。

li.stream().filter(d->"0".equalsIgnoreCase(d)).collect(
            Collector.of(
                    ArrayList::new,
                    ArrayList::add,
                    (a, b) -> {
                        a.addAll(b);
                        return a;
                    },
                    a -> a.isEmpty() ? li : a
            )
    );

寻找收集器文档:https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collector.html

答案 4 :(得分:-1)

首先检查您的列表是否包含该值。 如果是,则过滤列表 否则只需打印上一个列表

if(!lstStr.contains("0")) {
        lstStr.forEach(data2 -> System.out.println(data2));
    }else {
    List<String> filteredLst = lstStr.stream()
            .filter(data-> "1".equalsIgnoreCase(data))
            .collect(Collectors.toList());
    filteredLst.forEach(data2 -> System.out.println(data2));
    }