Lambda表达式根据条目

时间:2016-10-07 20:09:47

标签: java lambda java-8

我有一个订购的简单列表。

A = ["a","b","c","d","e"];

我需要根据标准生成列表的子集。如果数组中存在元素E,则返回元素E后面的List中的所有元素,否则返回null

通常情况下,我会这样做:

int index = A.indexOf("e");
List<String> subList = A.subList(index, A.size());

这可以用等效的lambda表达式来完成吗?

2 个答案:

答案 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;
    }
}

这将打印以下语句:

  • 元素E是“c”=&gt;并[d,E]
  • 元素E是“e”=&gt; []
  • 元素E是“g”=&gt;空

请注意,如果您使用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); ,则此谓词将无效。