2017-12-27 43 views
5

내가 가진 클래스 :Java 8 및 StringJoiner를 사용하여 목록의 두 필드를 어떻게 연결할 수 있습니까?

public class Item { 

    private String first; 
    private String second; 

    public Item(String first, String second) { 
     this.first = first; 
     this.second = second; 
    } 
} 

와 같은 객체 목록을 :

List<Item> items = asList(new Item("One", "Two"), new Item("Three", "Four")); 

내 목표는 다음과 같은 문자열을 구축하기 위해 요소리스트에 가입하는 것입니다 : 나는 '

One: Two; Three: Four; 

을 StringJoiner를 사용하려했지만 몇 가지 간단한 유형 목록과 함께 작동하도록 설계된 것처럼 보입니다.

당신은 공간으로 구분, 필드를 연결 한 다음 항목을 가입 문자열로 항목을 매핑 할 수 있습니다

답변

9

당신은 그런 식으로 뭔가를 시도 할 수 있습니다 :

final String result = items.stream() 
     .map(item -> String.format("%s: %s", item.first, item.second)) 
     .collect(Collectors.joining("; ")); 

로 아래의 설명에 언급 된 assylias이 마지막으로 ;이 건설을 사용하여 놓친 것입니다. 그것은 최종 String에 수동으로 추가 할 수 있습니다. 또는 간단하게 assylias가 제안한 해결책을 시도 할 수 있습니다.

+1

당신은'마지막 놓칠 것이다' – assylias

+0

당신은 그것을 위해 접두사/접미사 과부하를 사용할 수 있습니다. – shmosel

+0

@assylias 네 말이 맞아, 고마워! –

10

:

String result = items.stream() 
        .map(it -> it.field1 + ": " + it.field2 + ";") 
        .collect(Collectors.joining(" ")); 
+0

고마워요))) – Marian

2

첫 번째 단계는 field1field2을 결합하는 것입니다.

두 번째 단계는 ;과 (과) 결합합니다.

끝에 ;이 추가되지는 않습니다.

List<Item> items = asList(new Item("One", "Two"), new Item("Three", "Four")); 

String joined = items.stream() 
     // First step 
     .map(it -> it.field1 + ": " + it.field2) 
     // Second step 
     .collect(Collectors.joining("; ")); 

다소 OO

또는 더 나은 아직 : 이동 로직 전용 방법 field1field2에 가입 :

public static class Item { 
    private String field1; 
    private String field2; 

    public Item(String field1, String field2) { 
     this.field1 = field1; 
     this.field2 = field2; 
    } 

    public String getField1And2() { 
     return field1 + ": " + field2; 
    } 

} 

그리고 사용하는 스트림에서 한 그.

String joined = items.stream() 
     .map(Item::getField1And2) 
     .collect(Collectors.joining("; ")); 
+0

고마워)))) – Marian