Có cách nào ngắn gọn để lặp lại qua luồng trong khi có quyền truy cập vào chỉ mục trong luồng không?
String[] names = {"Sam","Pamela", "Dave", "Pascal", "Erik"};
List<String> nameList;
Stream<Integer> indices = intRange(1, names.length).boxed();
nameList = zip(indices, stream(names), SimpleEntry::new)
.filter(e -> e.getValue().length() <= e.getKey())
.map(Entry::getValue)
.collect(toList());
có vẻ khá thất vọng so với ví dụ LINQ được đưa ra ở đó
string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
var nameList = names.Where((c, index) => c.Length <= index + 1).ToList();
Có cách nào súc tích hơn không?
Hơn nữa, có vẻ như zip đã bị di chuyển hoặc bị xóa ...
IntStream.rangeClosed(x, y)
.
List<String> allCities = map.values().stream().flatMap(list -> list.stream()).collect(Collectors.toList());
zip
đã bị xóa, cùng với các luồng hai giá trị thử nghiệm được gọi khác nhau BiStream
hoặc MapStream
. Vấn đề chính là để thực hiện điều này một cách hiệu quả, Java thực sự cần một kiểu gõ (hoặc tuple) có cấu trúc. Thiếu một cái, thật dễ dàng để tạo một lớp Cặp hoặc Tuple chung - nó đã được thực hiện nhiều lần - nhưng tất cả chúng đều xóa cùng một loại.
intRange()
gì Cho đến nay, chúng ta không bắt gặp phương thức này trong Java 8.