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

16

我有以下使用java Stream的代码。

我试图让函数构建一个值为"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
    ...
}
3个回答

31

你的每个for循环迭代会覆盖separatedByComma的值。第一个迭代将String“a”赋给它,第二个迭代用“b”替换了它。

你应该使用Stream遍历stringsList中的元素,以便将匹配的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

非常感谢,您的解决方案恰好满足了我的需求。 - zaozaoer

4
在你的循环中,for(String word: strings),你覆盖了separatedByComma变量。

我认为你是对的,请问你能告诉我怎样修复呢?抱歉,我对Java Stream不太了解。 - zaozaoer
如果您想过滤occList并仅允许那些getOccSCd在字符串列表中的代码示例,我可以为您提供。 - talex
非常感谢您的快速回答。它非常有帮助! - zaozaoer

0

您还可以使用String.join(",", strings)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接