繁体   English   中英

如何在单个语句中创建新列表并添加值

[英]How to create a new list and add a value in single statement

我试图实现的目标可能毫无意义,但我想发现这一点来满足我的好奇心。

我正在尝试创建一个有效的语句,该语句将基于另一个语句创建一个新列表,并在末尾添加一个新值。

我是lambda表达式的新手,我不确定应该使用哪种列表。

该方法将如下所示:

private List<Integer> conjoin(List<Integer> list, Integer newValue){
    return new ArrayList<Integer>(list).stream()
            .map(value -> list.indexOf(value)==(list.size()-1) ? 
                    Arrays.asList(value, newValue) : 
                    Arrays.asList(value))
            .flatMap(Collection::stream)
            .collect(Collectors.toList());        
}

但更加整洁和高效。

还是有内置的方法可以做我不知道的事情?

我和其他任何人一样都喜欢一线,但它们要付出一定的代价-也就是说,比表述更难阅读。 因此,让我们从“正常”的方式开始做您要描述的事情:

ArrayList<E> copy = new ArrayList<>(list);
copy.add(value);
return copy;

虽然只有几行,但它高效,直接且易于阅读。 我们希望对这种语法进行任何改进,而不是为了简明而简单地替换可读性。 如果您要在已发布的实现和“正常”版本之间做出选择,则“正常”版本应该会比较有用。


我们可以尝试使用Stream.concat()Stream.of()改进您的解决方案。

return Stream.concat(list.stream(), Stream.of(value))
    .collect(Collectors.toList());

从技术上讲,这只是一条语句,但是我们仍然需要将其分成多行以使其可读。 它也比标准实现要复杂得多。


相反,我们可以使用番石榴为其不可变集合提供的构建器模式:

return new ImmutableList.Builder<E>().addAll(list).add(value).build();

这更加简洁,很好地传达了我们的意图。 这就是我建议实现您描述的行为的方式(使用Guava或定义自己的构建器模式 )。 它不仅适用于此特定用例,而且可以缩放为值和集合的任意组合。


认为 (很难读:))您的示例实际上新值替换了列表的最后一个值,而不是将其添加到末尾。 如果那是您想要的,只需使用List.sublist()截断列表中的最后一个元素,例如:

list.sublist(0, list.size() - 1)

在上面list任何地方都可使用该值排除最后一个值。

一种选择是使用

List<Integer> newList = (List<Integer>)ListUtils.union(list1,Arrays.asList(5));

来自Apache Commons Collections 我知道在内部这不是“一个声明”,但这是一个有用的库,无论如何,很可能会有很多人拥有它。


// Your list
ArrayList<Integer> myList = new ArrayList<Integer>();
myList.add(2);

// Create new list with new element
List<Integer> newList = (List<Integer>)ListUtils.union(myList,Arrays.asList(5));

你可以试试这个

 private List<Integer> conjoin(List<Integer> list, final Integer newValue){
      ArrayList<Integer> returnlist = new ArrayList<Integer>(list) {{
            add(newValue);
        }};
    return returnlist;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM