如何使用Java 8 Streams从List
获取下一个元素?
如果我在List
上进行迭代,我想将当前与列表的下一个元素进行比较。
使用Java 8 Stream是否可行?
答案 0 :(得分:13)
我的免费StreamEx库允许您使用额外的pairMap
中间操作来处理流元素对。像这样:
StreamEx.of(input).pairMap((current, next) -> doSomethingWith(current, next));
其中input
是Collection
,数组或Stream
。例如,通过这种方式,您可以轻松检查输入是否已排序:
boolean isSorted = StreamEx.of(input)
.pairMap((current, next) -> next.compareTo(current))
.allMatch(cmp -> cmp >= 0);
还有forPairs
终端操作,它是所有输入元素对的forEach
模拟:
StreamEx.of(input).forPairs((current, next) -> doSomethingWith(current, next));
这些功能可以很好地适用于任何流源(无论是否随机访问),并完全支持并行流。
答案 1 :(得分:10)
一种方法是生成IntStream
个索引,并按索引获取List
个元素。这仅在List
支持随机访问时才有效(即如果您的List
是LinkedList
,那么这是一个坏主意,因为list.get(i)
不会恒定的时间)。
例如:
IntStream.range(0,list.size()-1).forEach(i -> {
doSomething(list.get(i),list.get(i+1));
});
另一种方法是将最后一个元素存储在数组中:
List<Element> list = ...
Element[] arr = new Element[1];
list.stream().forEach(e -> {
if (arr[0] != null)
doSomething(arr[0],e);
arr[0]=e;
});
这仅适用于顺序流。
答案 2 :(得分:2)
Stream.reduce,具体取决于目标。如你所说,你想比较连续的元素,下面将打印&#34;相同的3&#34;:
Stream.of(1,2,3,3).reduce((a,b)->{
if(a==b) System.out.println("Same "+a);
return b; // will be "a" for next reduction
});
答案 3 :(得分:0)
您始终执行以下操作之一:
这个解决方案的实现可以在这个帖子中看到:Is it possible to get next element in the Stream?
答案 4 :(得分:0)
我必须这样做并比较流的元素(最初是数组)的差异。 所以我使用了一个方法作为UnaryOperator的参数,.map()期望如下......并且它对我有用,没有任何特殊的小发明:
import java.util.Arrays;
class streamDiffUtil {
public static void main(String[] args) {
int[] elements = {1,2,5};
int result = Arrays.stream(elements)
.map(value -> calcMaxDiff(value, elements))
.max()
.getAsInt();
System.out.println(result);
}
private static int calcMaxDiff(int j, int[] elements) {
return Arrays.stream(elements)
.map(value -> Math.abs(j-value))
.max().getAsInt();
}
}
最好的方法是知道calcMaxDiff方法如何等同于.map签名中的UnaryIntOperator。这有点超出我的意义。 希望这会对你有所帮助。
答案 5 :(得分:0)
例如,如果您有一个整数列表,并且想要检查它们是否升序排列,则可以执行以下操作:
@Test
public void test_listIsSorted() {
// create integer list for testing purposes: 0,1,2,3, .., 10
List<Integer> integerList = IntStream.range(0, 10)
.boxed()
.collect(Collectors.toList());
// stream list and compare item n with n+1
integerList.stream()
.reduce((integer1, integer2) -> {
assert integer1 < integer2 : "ordering must be ascending";
// return second value (which will be processed as "integer1" in the next iteration
return integer2;
});
}
这将比较像(0,1),(1,2,...,...