Java流到可以为空的字符串列表的集合

时间:2018-02-22 14:21:13

标签: java java-8 java-stream

我有一个可能为null的列表。 我想将该列表中的字符串连接成一个字符串。

例如。一个
list = [“你好”,“那里”]
期望的输出=“hello.there。”

例如。乙
list = null
期望的输出= null

我有一个适用于非空列表的方法:

List<String> myStringList = foo.getlist();
String result = myStringList.stream()
            .collect(Collectors.joining(".","","."));

但如果myStringList为null,则流将抛出错误。

我相信我应该使用类似于:

的可选流
List<String> myStringList = foo.getlist();
String result = Optional.ofNullable(myStringList)
    .map(Arrays::stream)
    .orElseGet(Stream::empty)
    .collect(Collectors.joining(".","","."))

然而,当我尝试这个时,我会收到“无法解析方法'流'”等错误。

我是以正确的方式来做这件事的吗? 为什么我的代码会出错?

4 个答案:

答案 0 :(得分:3)

这是个人意见,但我认为你不应该以这种方式使用OptionalOptional并非旨在取代简单的空检查。如果您已经拥有Optional,则使用它,或将其用作方法可能缺少的返回值。否则,我认为表达你的确切意图w.r.t更具表现力和可读性。列表为null或不是:

List<String> myStringList = foo.getlist();

String result = myStringList == null ? 
        null :
        myStringList.stream().collect(Collectors.joining(".","","."));

在这种情况下,三元运算符做得很好。

修改

如果连接的字符串是方法的返回值,那么使用Optional返回它将非常适合:

private Optional<String> joinedFooList(Foo foo) {
    List<String> myStringList = foo.getlist();
    return Optional.ofNullable(myStringList)
        .map(l -> l.stream().collect(Collectors.joining(".","",".")));
}

然后,您可以使用返回的Optional

joinedFooList(someFooInstance)
        .ifPresent(joined -> /* so something with the joined string */);

答案 1 :(得分:2)

问题在于您是否尝试使用Arrays::streamList转换为流。但是,Arrays::stream适用于数组

您需要List::stream(这是Collection::stream的继承版本,因此也可以使用):

String result = Optional.ofNullable(myStringList)
    .map(List::stream)
    .orElseGet(Stream::empty)
    .collect(Collectors.joining(".","","."));

答案 2 :(得分:2)

您可以使用 Collections.emptyList()

1-列表不为空:

List<String> myStringList = new ArrayList<>() ;
            myStringList.add("hello");
            myStringList.add("hello");

            String result = Optional.ofNullable(myStringList).orElse(Collections.emptyList()).stream()
                    .collect(Collectors.joining(".","","."));
            System.out.println(result);

输出:hello.hello.

2-列出null:

 List<String> myStringList2 = null;


             result = Optional.ofNullable(myStringList2).orElse(Collections.emptyList()).stream()
                    .collect(Collectors.joining(".","","."));
            System.out.println(result);

输出:.

如果需要,可以编辑输出

答案 3 :(得分:0)

如果第三方库是游戏,Apache CollectionUtils有一个很好的实用程序可以使列表为null安全:

List<String> myStringList = foo.getlist();
String result = CollectionUtils.emptyIfNull(myStringList).stream()
            .collect(Collectors.joining(".","","."));