我有一个订购的简单列表。
A = ["a","b","c","d","e"];
我需要根据标准生成列表的子集。如果数组中存在元素E
,则返回元素E
后面的List中的所有元素,否则返回null
。
通常情况下,我会这样做:
int index = A.indexOf("e");
List<String> subList = A.subList(index, A.size());
这可以用等效的lambda表达式来完成吗?
答案 0 :(得分:0)
如果列表中的元素是Comparable
,那么您可以这样做:
List<String> subList = list.stream()
.filter(elem -> elem.compareTo("e") > 0)
.collect(Collectors.toList());
这会返回一个空列表。
稍微更改过滤条件:
List<String> subList = list.stream()
.filter(elem -> elem.compareTo("e") >= 0)
.collect(Collectors.toList());
返回仅包含"e"
。
请注意,您无需订购列表即可使用。此外,您甚至不需要该元素出现在列表中,即如果列表为如下:
List<String> list = Arrays.asList("a", "b", "d", "e");
并修改过滤条件以返回"c"
之后的元素:
List<String> subList = list.stream()
.filter(elem -> elem.compareTo("c") > 0)
.collect(Collectors.toList());
结果为["d", "e"]
。
答案 1 :(得分:-2)
如果您真的想使用Java 8 Streams和Lambads,则可以使用有状态谓词
SELECT sum(FieldValue) as somma
FROM my_values as value
WHERE value.FieldName ='counter'
然后像这样使用它:
public class IsAfterString implements Predicate<String> {
private final String stringToWatchFor;
private boolean foundString = false;
public IsAfterString(String stringToWatchFor) {
this.stringToWatchFor = stringToWatchFor;
}
@Override
public boolean test(String s) {
if (foundString) {
return true;
}
foundString = stringToWatchFor.equals(s);
return false;
}
}
这将打印以下语句:
请注意,如果您使用List<String> a = Arrays.asList("a", "b", "c", "d", "e");
IsAfterString predicate = new IsAfterString("c");
List<String> list = a.stream().filter(predicate).collect(Collectors.toList());
list = predicate.hasFoundString() ? list : null;
System.out.println(list);
,则此谓词将无效。