使用Java流获取逗号分隔的字符串

时间:2018-11-14 08:20:37

标签: java java-8 java-stream

我使用Java Stream使用以下代码。

在这种情况下,我尝试使用get函数来构建值字符串:“ a,b”。 但是,输出(在这种情况下为separatedByComma)始终为“ b”。

请问有人可以照亮吗?

@Test
public void testJoin() {
    List<MOccS> occList = new ArrayList<> (  );
    MOccS mOccS = new MOccS ();
    mOccS.setOccSCd ( "1" );
    mOccS.setOccSNm ( "a" );
    occList.add ( mOccS );

    MOccS mOccS2 = new MOccS ();
    mOccS2.setOccSCd ( "2" );
    mOccS2.setOccSNm ( "b" );
    occList.add ( mOccS2 );


    List<String> strings = new ArrayList<> (  );
    strings.add ( "1" );
    strings.add ( "2" );

    String separatedByComma = "";
    for(String word: strings) {
        separatedByComma = occList.stream ()
                                  .filter ( occ -> word.equalsIgnoreCase ( occ.getOccSCd () ) )         
                                  .map ( occ -> occ.getOccSNm () )
                                  .collect ( Collectors.joining ( "," ) );
     }

     System.out.println (separatedByComma);
}


class MOccS{
    String occSCd;
    String occSNm;
    ...
    getter/setter
    ...
}

2 个答案:

答案 0 :(得分:5)

for循环的每次迭代都会覆盖separatedByComma的值。第一次迭代将String“ a”分配给它,第二次迭代将其替换为“ b”。

您应该在Stream strings的元素上List以便将与它们匹配的String合并到单个输出String中:

String separatedByComma = 
    strings.stream()
           .flatMap(word -> occList.stream()
                                   .filter(occ -> word.equalsIgnoreCase (occ.getOccSCd()))
                                   .map (occ -> occ.getOccSNm()))
           .collect(Collectors.joining (","));

输出:

a,b

答案 1 :(得分:4)

在循环for(String word: strings)中,您将覆盖separatedByComma变量。