2017-09-25 29 views
5

Tôi có một luồng các phần tử. Tôi muốn ánh xạ từng phần tử thành hai phần tử khác nhau cùng loại để luồng của tôi dài hơn hai lần. Tôi đã làm điều này bằng cách nối hai dòng, nhưng tôi tự hỏi là nó có thể làm điều này đơn giản hơn? Những gì tôi đã thực hiện cho đến thời điểm này:Dòng Java 8 - phần tử bản đồ để ghép các thành phần

private List<String> getTranslationFilesNames() { 
return Stream.concat(SUPPORTED_LANGUAGES.stream() 
       .map(lang -> PATH_TO_FILES_WITH_TRANSLATIONS_1 + lang + FILE_EXTENSION), 
     SUPPORTED_LANGUAGES.stream() 
       .map(lang -> PATH_TO_FILES_WITH_TRANSLATIONS_2 + lang + FILE_EXTENSION)) 
     .collect(Collectors.toList()); 
} 

Tôi không tìm thấy giải pháp này rất thanh lịch. Có cách tiếp cận tốt hơn để đạt được hiệu quả tương tự?

Trả lời

5

Nếu bạn không quan tâm đến thứ tự, bạn có thể lập bản đồ từng yếu tố để một cặp của các yếu tố với flatMap:

private List<String> getTranslationFilesNames() { 
    return SUPPORTED_LANGUAGES.stream() 
      .flatMap(lang -> Stream.of(PATH_TO_FILES_WITH_TRANSLATIONS_1 + lang + FILE_EXTENSION, 
             PATH_TO_FILES_WITH_TRANSLATIONS_2 + lang + FILE_EXTENSION)), 
      .collect(Collectors.toList()); 
} 
+0

@Eugene Tôi đã bỏ lỡ điều đó. Tôi nghĩ hai Streams giống hệt nhau. Đã sửa. Cảm ơn. – Eran

4

Thay vì tạo ra một kết hợp Stream, bạn chỉ có thể sử dụng toán tử #flatMap lặp các yếu tố đầu vào (lưu ý rằng đây có thể là giải pháp phù hợp chỉ khi thứ tự các yếu tố không quan trọng):

private List<String> getTranslationFilesNames() { 
    return SUPPORTED_LANGUAGES.stream() 
     .flatMap(s -> Stream.of(
       PATH_TO_FILES_WITH_TRANSLATIONS_1 + s + FILE_EXTENSION, 
       PATH_TO_FILES_WITH_TRANSLATIONS_2 + s + FILE_EXTENSION 
     ) 
    ) 
     .collect(Collectors.toList()); 
} 
+0

PATH_TO_FILES_WITH_TRANSLATIONS_1 ở đâu? –

+0

Tệ của tôi, tôi đã cập nhật câu trả lời cho phù hợp với câu hỏi của bạn. – tmarwen

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