gpt4 book ai didi

java - 如何访问 java 8 排序流中的前一项?

转载 作者:行者123 更新时间:2023-11-30 07:40:40 24 4
gpt4 key购买 nike

在排序流中,我想访问前一个元素。

我正在寻找这样的东西:

class Main {
public static void main(String[] args) {
List<String> stringList = Arrays.asList("1: First", "2: Second", "3: Third", "4: Fourth");

List<String> resultList = stringList.stream()
.sorted()
.filter(s -> s.contains("Second") && s.previous().contains("First"))
^^^^^^^^^^^^ doesn't compile
.collect(Collectors.toList());

System.out.println(resultList);
}
}

这种情况下的预期输出是

Second

重要提示:我想分解出 filter() 方法中的 lambda,以便在不同的地方重用它。

最佳答案

您可以保存每一步的上一个:

class Main {
public static void main(String[] args) {
List<String> stringList = Arrays.asList("1: First", "2: Second", "3: Third", "4: Fourth");
List<String> resultList = stringList.stream()
.sorted()
.filter(new Predicate<String>() {
private String prev = null;

@Override
public boolean test(String s) {
boolean result = s.contains("Second") && prev != null && prev.contains("First");
prev = s;
return result;
}
})
.collect(Collectors.toList());
System.out.println(resultList);
}
}

并且您可以定义单独的自定义 Predicate 类以重用:

class Main {
public static void main(String[] args) {
List<String> stringList = Arrays.asList("1: First", "2: Second", "3: Third", "4: Fourth");
List<String> resultList = stringList.stream()
.sorted()
.filter(new WithPrevPredicate() {
@Override
public boolean test(String prev, String current) {
return current.contains("Second") && prev != null && prev.contains("First");
}
})
.collect(Collectors.toList());
System.out.println(resultList);
}

private static abstract class WithPrevPredicate<T> implements Predicate<T> {
private T prev = null;

@Override
public boolean test(T current) {
boolean test = test(prev, current);
prev = current;
return test;
}

public abstract boolean test(T prev, T current);
}
}

关于java - 如何访问 java 8 排序流中的前一项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57215262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com