为了账号安全,请及时绑定邮箱和手机立即绑定

无法解析 Java 流中的方法 Character::hashCode

无法解析 Java 流中的方法 Character::hashCode

一只名叫tom的猫 2023-03-09 15:20:59
在我的示例中,我尝试从一系列字符创建一个 ASCII 表。我设法用一个List字符串来做,但用一个字符数组失败了。我收到Character::hashCode无法在Collectors.toMap().Error:(26, 17) java: method collect in interface java.util.stream.IntStream cannot be applied to given types;  required: java.util.function.Supplier<R>,java.util.function.ObjIntConsumer<R>,java.util.function.BiConsumer<R,R>  found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.Map<java.lang.Object,java.lang.Object>>  reason: cannot infer type-variable(s) R    (actual and formal argument lists differ in length)Error:(26, 42) java: incompatible types: cannot infer type-variable(s) T,K,U,T    (argument mismatch; invalid method reference      incompatible types: java.lang.Object cannot be converted to char)有办法吗?public class JavaCollectToMapEx2 {    public static void main(String[] args) {        // list of ASCII characters        var chars = List.of("a", "b", "c", "d", "e", "f",                "g", "h", "i", "j", "k", "l", "m", "n",                "o", "p", "q", "r", "s", "t", "u", "v",                "w", "x", "y", "z");//      CharSequence chars2 = "abcdefghijklmnopqrstuvwxyz";        char[] letters = "abcdefghijklmnopqrstuvwxyz".toCharArray();        // Map to represent ASCII character table        Map<Integer, String> asciiMap = chars.stream()           .collect(Collectors.toMap(String::hashCode, Function.identity()));        Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()             .collect(Collectors.toMap(Character::hashCode, Function.identity()));        System.out.println(asciiMap);        System.out.println(asciiMap2);    }}
查看完整描述

3 回答

?
Smart猫小萌

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,因为它对您想要的方法不明确,因为有两种可能的方法:

  1. Object#hashCode 的覆盖,

  2. 静态方法int hashCode(char value)

从这段代码中可以看出,两者都满足 的第一个参数toMap()

Function<Character, Integer> f1 = e -> Character.hashCode(e);
Function<Character, Integer> f2 = e -> e.hashCode();

要解决此问题,您可以使用Object::hashCode非静态方法调用。


查看完整回答
反对 回复 2023-03-09
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

collect()由于您使用的是after CharBuffer::charswhich 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()));


查看完整回答
反对 回复 2023-03-09
?
有只小跳蛙

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()));


查看完整回答
反对 回复 2023-03-09
  • 3 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信