2015-02-18 40 views
5

Tôi đang cố gắng để có được Java 8 và có được đầu của tôi xung quanh suối và lambdas để giải quyết các vấn đề khác nhau và bị mắc kẹt trên này cụ thể mà tôi thường sử dụng một forEach và lưu trữ các giá trị trong một bản đồ để giải quyết.Java 8 suối thêm giá trị từ hai hoặc nhiều danh sách

Bạn sẽ viết mã như thế nào để nhận danh sách dự kiến ​​bằng các tính năng mới trong Java 8?

List<Integer> voterA = Arrays.asList(1,2,3,4,5); 
List<Integer> voterB = Arrays.asList(1,2,3,4,5); 
List<List<Integer>> votes = Arrays.asList(voterA, voterB); 

// expected list = (2,4,6,8,10) 
List<Integer> sumVotes = ... 
+2

Bạn sẽ giải quyết nó bằng (các) vòng lặp nâng cao như thế nào? – Pshemo

+0

Hãy xem [câu hỏi] (http://stackoverflow.com/questions/17640754/zipping-streams-using-jdk8-with-lambda-java-util-stream-streams-zip) –

Trả lời

6

Điều đó thực sự không thể thực hiện theo cách bạn đang hy vọng. Gần nhất bạn có thể nhận được có thể là

IntStream.range(0, voterA.size()) 
    .mapToObj(i -> voterA.get(i) + voterB.get(i)) 
    .collect(toList()); 

... nhưng không có hoạt động "zip" trên các luồng khác nhau, vì vậy bạn không thể xếp chúng lên đúng cách.

+3

Thật khó chịu mà tôi có thể thấy chính xác như thế nào tôi sẽ làm điều này trong C# trong LINQ - một cách khá chung chung - nhưng tôi vẫn mò mẫm xung quanh khi nói đến dòng Java. Có lẽ khi tôi tập luyện nhiều hơn ... –

+1

Ý tôi là ... Tôi nhìn vào giao diện Spliterator, và tôi không nghĩ rằng có bất kỳ cách _nice_ nào để nén, chỉ vì 'trySplit' cho phép sự phân chia xảy ra tại một điểm tùy ý . Bạn có thể lập chỉ mục hiệu quả với các trình phân tách SUBSIZED và quay trở lại phương pháp tiếp cận ít hiệu quả hơn cho các bộ tách khác, nhưng tôi không nghĩ rằng bạn có thể làm gì với việc nén. –

+1

Đây là phiên bản C#, hoàn chỉnh với 3 cử tri có độ dài khác nhau của danh sách: https://gist.github.com/jskeet/2c1db126e424cf58cb69 –

2

JDK không cung cấp API 'zip'. Nhưng nó có thể được thực hiện với thư viện thứ ba AbacusUtil:

List<Integer> voterA = Arrays.asList(1, 2, 3, 4, 5); 
List<Integer> voterB = Arrays.asList(1, 2, 3, 4, 5); 

List<Integer> sumVotes = Stream.zip(voterA, voterB, (a, b) -> a + b).toList(); 

Tiết lộ : Tôi là nhà phát triển của AbacusUtil.

Các vấn đề liên quan