![](/img/trans.png)
[英]How to add a multiple value in a single list HashMap<Integer, ArrayList<User>> map1 = new HashMap<Integer, ArrayList<User>>();
[英]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.