标签: collectors

Collectors.toMap中的Java 8 NullPointerException

如果其中一个值为'null' ,Java 8 Collectors.toMap将抛出一个NullPointerException.我不明白这种行为,map可以包含null指针作为值而没有任何问题.有没有一个很好的理由为什么值不能为空Collectors.toMap

另外,是否有一个很好的Java 8方法来修复它,或者我应该恢复到普通的旧循环?

我的问题的一个例子:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


class Answer {
    private int id;

    private Boolean answer;

    Answer() {
    }

    Answer(int id, Boolean answer) {
        this.id = id;
        this.answer = answer;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Boolean getAnswer() {
        return answer;
    }

    public void setAnswer(Boolean answer) {
        this.answer = answer;
    }
}

public class Main …
Run Code Online (Sandbox Code Playgroud)

java nullpointerexception java-8 java-stream collectors

292
推荐指数
7
解决办法
7万
查看次数

Java8:HashMap <X,Y>到HashMap <X,Z>使用Stream/Map-Reduce/Collector

我知道如何ListY- > "转换"一个简单的Java Z,即:

List<String> x;
List<Integer> y = x.stream()
        .map(s -> Integer.parseInt(s))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

现在我想用Map做基本相同的事情,即:

INPUT:
{
  "key1" -> "41",    // "41" and "42"
  "key2" -> "42      // are Strings
}

OUTPUT:
{
  "key1" -> 41,      // 41 and 42
  "key2" -> 42       // are Integers
}
Run Code Online (Sandbox Code Playgroud)

解决方案不应限于String- > Integer.就像List上面的例子一样,我想调用任何方法(或构造函数).

java mapreduce java-8 java-stream collectors

188
推荐指数
6
解决办法
15万
查看次数

如何将Java8流的元素添加到现有List中

收集器的Javadoc显示如何将流的元素收集到新的List中.是否有一个单行程序将结果添加到现有的ArrayList中?

java java-8 java-stream collectors

139
推荐指数
4
解决办法
16万
查看次数

是否有收集到订单保留集的收集器?

Collectors.toSet()不保留秩序.我可以使用Lists代替,但我想指出结果集合不允许元素重复,这正是Set接口的用途.

java java-8 collectors

102
推荐指数
1
解决办法
2万
查看次数

将List拆分为沿元素的子列表

我有这个清单(List<String>):

["a", "b", null, "c", null, "d", "e"]
Run Code Online (Sandbox Code Playgroud)

我想要这样的事情:

[["a", "b"], ["c"], ["d", "e"]]
Run Code Online (Sandbox Code Playgroud)

换句话说,我想使用null值作为分隔符将我的列表拆分为子列表,以获取列表列表(List<List<String>>).我在寻找Java 8解决方案.我尝试过,Collectors.partitioningBy但我不确定这是我在寻找什么.谢谢!

java list java-8 collectors

65
推荐指数
5
解决办法
3万
查看次数

Java 8 Collectors.toMap SortedMap

我正在使用Java 8 lambdas并希望Collectors toMap用来返回一个SortedMap.我能想出的最好的是调用下面Collectors toMap用假设法mergeFunctionmapSupplier等于TreeMap::new.

public static <T, K, U, M extends Map<K, U>>
        Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                Function<? super T, ? extends U> valueMapper,
                BinaryOperator<U> mergeFunction,
                Supplier<M> mapSupplier) {
    BiConsumer<M, T> accumulator = (map, element) -> map.merge(keyMapper.apply(element),
            valueMapper.apply(element), mergeFunction);
    return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}
Run Code Online (Sandbox Code Playgroud)

我不想传递合并函数,正如我想要throwingMerger()的那样,与基本toMap实现相同,如下所示:

public static <T, K, U>
        Collector<T, ?, Map<K, U>> toMap(Function<? …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream collectors

64
推荐指数
5
解决办法
3万
查看次数

Collectors.toSet()和HashSet

采取以下示例代码行:

Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

我想要一个HashSet.把调试器带到代码中,我确实得到了一个HashSet.我看了看java.util.stream.Collectors.toSet()下面的代码:

public static <T> Collector<T, ?, Set<T>> toSet() {
    return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
                               (left, right) -> { left.addAll(right); return left; },
                               CH_UNORDERED_ID);
}
Run Code Online (Sandbox Code Playgroud)

合同保证 a Set,实施决定a HashSet; 看似合理.但是,我的实现需要由a保证的恒定时间查找HashSet,而不仅仅是任何旧的查找Set.如果执行toSet()决定使用say a FooSet,这完全在其权利范围内,那么我的实现就会受到影响.

这个问题的最佳实践解决方案是什么?

java java-8 java-stream collectors

63
推荐指数
1
解决办法
3万
查看次数

Collectors.toList()返回什么样的List <E>?

我正在阅读Lambda:Libraries Edition的状态,我对一个声明感到惊讶:

Streams部分下,有以下内容:

List<Shape> blue = shapes.stream()
                         .filter(s -> s.getColor() == BLUE)
                         .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

该文件没有说明shapes实际是什么,我不知道它是否重要.

令我困惑的是:List这段代码返回了什么样的具体内容?

  • 它将变量赋值给a List<Shape>,这是完全正常的.
  • stream()filter()决定使用哪种列表.
  • Collectors.toList()既没有指定具体的类型List.

那么,这里使用的具体类型(子类)List是什么?有保证吗?

java lambda list java-8 collectors

61
推荐指数
2
解决办法
5万
查看次数

在Java 8 Streams中使用Streams的Hashmap来收集Map的值

让我们考虑一个hashmap

Map<Integer, List> id1 = new HashMap<Integer,List>();
Run Code Online (Sandbox Code Playgroud)

我在两个hashmap中都插入了一些值.

例如,

    List<String> list1 = new ArrayList<String>();

    list1.add("r1");
    list1.add("r4");

    List<String> list2 = new ArrayList<String>();
    list2.add("r2");
    list2.add("r5");

    List<String> list3 = new ArrayList<String>();
    list3.add("r3");
    list3.add("r6");

    id1.put(1,list1);
    id1.put(2,list2);
    id1.put(3,list3);
    id1.put(10,list2);
    id1.put(15,list3);
Run Code Online (Sandbox Code Playgroud)

Q1)现在我想对hashmap中的键应用过滤条件并检索相应的值(List).

例如:这里我的查询是key = 1,输出应该是'list1'

我写

id1.entrySet().stream().filter( e -> e.getKey() == 1);
Run Code Online (Sandbox Code Playgroud)

但我不知道如何检索列表作为此流操作的输出.

Q2)我想再次对hashmap中的键应用过滤条件并检索相应的列表列表.

例如:这里我的查询是key = 1%(即键可以是1,10,15),输出应该是'list1','list2','list3'(列表列表).

java hashmap java-8 collectors

48
推荐指数
3
解决办法
13万
查看次数

Collectors.groupingBy不接受null键

在Java 8中,这适用于:

Stream<Class> stream = Stream.of(ArrayList.class);
HashMap<Class, List<Class>> map = (HashMap)stream.collect(Collectors.groupingBy(Class::getSuperclass));
Run Code Online (Sandbox Code Playgroud)

但这不是:

Stream<Class> stream = Stream.of(List.class);
HashMap<Class, List<Class>> map = (HashMap)stream.collect(Collectors.groupingBy(Class::getSuperclass));
Run Code Online (Sandbox Code Playgroud)

Maps允许null键,List.class.getSuperclass()返回null.但Collectors.grouping可以在Collectors.java第907行发出NPE:

K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key"); 
Run Code Online (Sandbox Code Playgroud)

如果我创建自己的收集器,它的工作原理改为:

K key = classifier.apply(t);  
Run Code Online (Sandbox Code Playgroud)

我的问题是:

1)Collectors的Javadoc.GroupingBy并没有说它不应该映射一个空键.出于某种原因这种行为是否必要?

2)是否有另一种更简单的方法来接受一个空键,而不必创建我自己的收集器?

java hashmap java-8 java-stream collectors

39
推荐指数
3
解决办法
2万
查看次数