我有这个清单
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));
谢谢。
答案 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));
}