Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
java stream 分组合并_我的世界java整合包安装失败,希望能够帮助你!!!。
今天在使用Java合并两个List并生成Map过程中,没有注意到key存在重复的可能,以为后面的会自动覆盖前面的,没想到会抛出异常。
java.lang.IllegalStateException: Duplicate key first at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133) at java.util.HashMap.merge(HashMap.java:1254) at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
具体代码如下:
public class User { private String name; private String title; public User() { } public User(String name, String title) { this.name = name; this.title = title; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public String toString() { final StringBuilder sb = new StringBuilder("User{"); sb.append("name='").append(name).append('\''); sb.append(", title='").append(title).append('\''); sb.append('}'); return sb.toString(); } } @Test public void testSteamList() { List<User> userList1 = new ArrayList<>(); List<User> userList2 = new ArrayList<>(); userList1.add(new User("Lisi", "first")); userList1.add(new User("wang", "second")); userList2.add(new User("Lisi", "third")); userList2.add(new User("huang", "four")); // OK //Map<String, String> userMap = Stream.of(userList1, userList2).flatMap(Collection::stream) // .collect(Collectors.toMap(User::getName, User::getTitle, (key1, key2) -> key2)); // throw exception Map<String, String> userMap = Stream.of(userList1, userList2).flatMap(Collection::stream) .collect(Collectors.toMap(User::getName, User::getTitle)); System.out.println(userMap); }
深入源代码查看了下:
//Collectors类里 public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) { return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new); } //其中throwingMerger是如果直接抛出异常。 private static <T> BinaryOperator<T> throwingMerger() { return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); }; } //使用带MergeFunction参数的方法,自己来处理。 public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction) { return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new); } //使用了BinaryOperator<U> mergeFunction来处理key的问题。 @FunctionalInterface public interface BinaryOperator<T> extends BiFunction<T,T,T> { ... } @FunctionalInterface public interface BiFunction<T, U, R> { /** * Applies this function to the given arguments. * * @param t the first function argument * @param u the second function argument * @return the function result */ R apply(T t, U u); .. } // 所以这里使用 (key1, key2) -> key1 来做key的处理,就不会抛出异常了。
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
下一篇
已是最新文章