私はちょっとしたプログラミングをしていましたが、ClassCastException
を見つけました。背景として、私は、問題を示すために、運動の簡易版を与えている:文字だけA
またはB
キーと値として出現数などの文字でマップを計算を含む文字列を考えるとグループ化でカスタムマップサプライヤを使用しているときのClassCastException
。さらに、マップには必ず両方の文字がキーとして含まれている必要があります(文字が入力文字列にない場合は値がゼロ)。
例:
"A" => {A=1, B=0}
"AAB" => {A=2, B=1}
私の最初のソリューションは、以下ました:
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
public Map<Character, Long> createResult(String input) {
Map<Character, Long> map = input.chars()
.mapToObj(c -> (char) c)
.collect(groupingBy(c -> c, counting()));
map.putIfAbsent('A', 0L);
map.putIfAbsent('B', 0L);
return map;
}
このソリューションでは、働いていたが、私はそれがあった場合は試してみたかったですpos入力A
でcreateResult2
を呼び出すとき
public HashMap<Character, Long> createResult2(String input) {
return input.chars()
.mapToObj(c -> (char) c)
.collect(groupingBy(c -> c, this::mapFactory, counting()));
}
private HashMap<Character, Long> mapFactory() {
HashMap<Character, Long> map = new HashMap<>();
map.put('A', 0L);
map.put('B', 0L);
return map;
}
ClassCastException
は、実行時にスローされます:groupingBy
関数にデフォルト値を使用してマップを供給するsible
java.lang.ClassCastException: java.lang.Long cannot be cast to [Ljava.lang.Object; at java.util.stream.Collectors.lambda$groupingBy$45(Collectors.java:909) at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) at java.util.stream.IntPipeline$4$1.accept(IntPipeline.java:250) at java.lang.CharSequence$1CharIterator.forEachRemaining(CharSequence.java:149) at java.util.Spliterators$IntIteratorSpliterator.forEachRemaining(Spliterators.java:1908) at java.util.Spliterator$OfInt.forEachRemaining(Spliterator.java:693) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
なぜこれが起こっている誰もが説明できますか?
ストリームは、この単純な問題のために過剰なもののように見えます。さらに悪いことに、stacktraceには*あなたの*コードがエラーを引き起こした場所については何も含まれていません。それが私には単純なループを使用するのに十分な理由です。 –
stacktraceの最後の行は、自分のコードスニペットの 'collect'呼び出しに対応しています。 – eee
@LutzHornこの質問はなぜこれが起こっているのか、そしてエクササイズを解決する方法については詳しくありません。 – eee