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

在我的示例中,我尝试从一系列字符创建一个 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);

    }

}


一只名叫tom的猫
浏览 128回答 3
3回答

Smart猫小萌

.chars()给你一个IntStream,它是原始流int,而不是字符流(更多信息)。这就是为什么没有方法引用Character会起作用的原因。要实现您的目标,您Stream<Character>首先需要:Map<Integer,&nbsp;Character>&nbsp;asciiMap2&nbsp;=&nbsp;CharBuffer.wrap(letters) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.chars() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mapToObj(e&nbsp;->&nbsp;(char)&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toMap(e&nbsp;->&nbsp;e.hashCode(),&nbsp;Function.identity()));现在,您仍然有使用方法引用获取哈希码的问题。您不能使用Character::hashCode,因为它对您想要的方法不明确,因为有两种可能的方法:Object#hashCode 的覆盖,静态方法int hashCode(char value)从这段代码中可以看出,两者都满足 的第一个参数toMap():Function<Character,&nbsp;Integer>&nbsp;f1&nbsp;=&nbsp;e&nbsp;->&nbsp;Character.hashCode(e); Function<Character,&nbsp;Integer>&nbsp;f2&nbsp;=&nbsp;e&nbsp;->&nbsp;e.hashCode();要解决此问题,您可以使用Object::hashCode非静态方法调用。

慕码人2483693

collect()由于您使用的是after&nbsp;CharBuffer::charswhich returns的方法IntStream,因此您可以使用的唯一收集方法是IntStream::collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, &nbsp;BiConsumer<R,R> combiner)采用 3 个参数。如果你想使用单参数收集方法,IntStream::boxed在它之前放置 return&nbsp;Stream<Integer>。然后该方法Character::hashCode变得不明确,无法使用 lambda 表达式:hashCode()hashCode(char value)为避免这种情况,只需使用更好的方法直接mapToObj转换为char而不需要装箱,然后使用Object::hashCode从 `Object 继承:Map<Integer,&nbsp;Character>&nbsp;asciiMap2&nbsp;=&nbsp;CharBuffer.wrap(letters).chars() &nbsp;&nbsp;&nbsp;&nbsp;.mapToObj(ch&nbsp;->&nbsp;(char)&nbsp;ch) &nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toMap(Object::hashCode,&nbsp;Function.identity()));

有只小跳蛙

首先,您需要将 映射IntStream到 a Stream<Character>。但在那之后你不能使用方法引用,Character::hashCode因为它是不明确的(对象级别和类级别):Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()&nbsp; &nbsp; &nbsp; &nbsp; .mapToObj(i -> (char) i)&nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toMap(i -> Character.hashCode(i), Function.identity()));或者,您可以只使用Object::hashCodeinstead ofi -> Character.hashCode(i)因为该类使用以下方法Character覆盖了它的方法:hashCode()Character.hashCode()public final class Character ... {&nbsp; &nbsp; @Override&nbsp; &nbsp; public int hashCode() {&nbsp; &nbsp; &nbsp; &nbsp; return Character.hashCode(value);&nbsp; &nbsp; }}所以最后你可以使用这个:Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()&nbsp; &nbsp; &nbsp; &nbsp; .mapToObj(i -> (char) i)&nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toMap(Object::hashCode, Function.identity()));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java