3 回答
TA贡献1911条经验 获得超7个赞
.chars()
给你一个IntStream
,它是原始流int
,而不是字符流(更多信息)。这就是为什么没有方法引用Character
会起作用的原因。
要实现您的目标,您Stream<Character>
首先需要:
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters) .chars() .mapToObj(e -> (char) e) .collect(Collectors.toMap(e -> e.hashCode(), Function.identity()));
现在,您仍然有使用方法引用获取哈希码的问题。您不能使用Character::hashCode
,因为它对您想要的方法不明确,因为有两种可能的方法:
Object#hashCode 的覆盖,
静态方法
int hashCode(char value)
从这段代码中可以看出,两者都满足 的第一个参数toMap()
:
Function<Character, Integer> f1 = e -> Character.hashCode(e); Function<Character, Integer> f2 = e -> e.hashCode();
要解决此问题,您可以使用Object::hashCode
非静态方法调用。
TA贡献1860条经验 获得超9个赞
collect()
由于您使用的是after CharBuffer::chars
which returns的方法IntStream
,因此您可以使用的唯一收集方法是IntStream::collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,R> combiner)
采用 3 个参数。
如果你想使用单参数收集方法,IntStream::boxed
在它之前放置 return Stream<Integer>
。然后该方法Character::hashCode
变得不明确,无法使用 lambda 表达式:
为避免这种情况,只需使用更好的方法直接mapToObj
转换为char
而不需要装箱,然后使用Object::hashCode
从 `Object 继承:
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars() .mapToObj(ch -> (char) ch) .collect(Collectors.toMap(Object::hashCode, Function.identity()));
TA贡献1824条经验 获得超8个赞
首先,您需要将 映射IntStream到 a Stream<Character>。但在那之后你不能使用方法引用,Character::hashCode因为它是不明确的(对象级别和类级别):
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()
.mapToObj(i -> (char) i)
.collect(Collectors.toMap(i -> Character.hashCode(i), Function.identity()));
或者,您可以只使用Object::hashCodeinstead ofi -> Character.hashCode(i)因为该类使用以下方法Character覆盖了它的方法:hashCode()Character.hashCode()
public final class Character ... {
@Override
public int hashCode() {
return Character.hashCode(value);
}
}
所以最后你可以使用这个:
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()
.mapToObj(i -> (char) i)
.collect(Collectors.toMap(Object::hashCode, Function.identity()));
添加回答
举报