Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法解析Java流中的方法Character::hashCode_Java_Lambda_Java 8_Java Stream - Fatal编程技术网

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

无法解析Java流中的方法Character::hashCode,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,在我的示例中,我尝试从一系列字符创建一个ASCII表。我设法用字符串的列表来完成,但用字符数组失败了 我得到一个错误,Character::hashCode无法在Collectors.toMap()中解决 错误:(26,17)java:java.util.stream.IntStream接口中的方法collect无法应用于给定类型; 必需:java.util.function.Supplier、java.util.function.ObjIntConsumer、java.util.functio

在我的示例中,我尝试从一系列字符创建一个ASCII表。我设法用字符串的
列表
来完成,但用字符数组失败了

我得到一个错误,
Character::hashCode
无法在
Collectors.toMap()
中解决

错误:(26,17)java:java.util.stream.IntStream接口中的方法collect无法应用于给定类型;
必需:java.util.function.Supplier、java.util.function.ObjIntConsumer、java.util.function.BiConsumer
找到:java.util.stream.Collector
原因:无法推断类型变量R
(实际参数列表和正式参数列表长度不同)
错误:(26,42)java:不兼容的类型:无法推断类型变量T,K,U,T
(参数不匹配;方法引用无效。)
不兼容类型:java.lang.Object无法转换为字符)
有办法吗

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);
    }
}
公共类JavaCollectToMapEx2{
公共静态void main(字符串[]args){
//ASCII字符列表
var chars=列表中的“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=“abcdefghijklmnopqrstuvxyz”;
char[]letters=“abcdefghijklmnopqrstuvxyz.toCharArray();
//映射以表示ASCII字符表
映射ascimap=chars.stream()
.collect(Collectors.toMap(String::hashCode,Function.identity());
Map asciiMap2=CharBuffer.wrap(字母).chars()
.collect(Collectors.toMap(Character::hashCode,Function.identity());
系统输出打印LN(ASCIMAP);
系统输出打印LN(asciiMap2);
}
}
将为您提供一个
IntStream
,它是一个基本
int
流,而不是一个字符流()。这就是为什么
字符
上的方法引用不起作用的原因

要实现您想要的目标,您首先需要一个

Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters)
        .chars()
        .mapToObj(e -> (char) e)
        .collect(Collectors.toMap(e -> e.hashCode(), Function.identity()));

要解决这个问题,可以对非静态方法调用使用
Object::hashCode

首先需要将
IntStream
映射到
流。但是在此之后,您不能使用方法reference
Character::hashCode
,因为它是不明确的(对象级和类级):

所以最后你可以用这个:

Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()
        .mapToObj(i -> (char) i)
        .collect(Collectors.toMap(Object::hashCode, Function.identity()));
Map asciiMap2=CharBuffer.wrap(字母).chars()
.mapToObj(i->(char)i)
.collect(Collectors.toMap(Object::hashCode,Function.identity());

由于您使用的是方法
collect()
,返回之后,您可以使用的唯一收集方法是获取3个参数

如果您希望使用一种参数收集方法,请将其置于返回
流的前面。然后方法
Character::hashCode
变得不明确,不能使用lambda表达式:

为了避免这种情况,只需使用更好的方法直接强制转换到
char
,而不需要装箱,然后使用从`Object:

Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()
    .mapToObj(ch -> (char) ch)
    .collect(Collectors.toMap(Object::hashCode, Function.identity()));
Map asciiMap2=CharBuffer.wrap(字母).chars()
.mapToObj(ch->(char)ch)
.collect(Collectors.toMap(Object::hashCode,Function.identity());

没有错误消息???我已经添加了完整的错误消息。关于发布的编译器错误,实际问题是
IntStream
没有
collect(Collector)
方法。另一种选择是
CharBuffer.wrap(letters.chars().boxed().collect(Collectors.toMap(Function.identity(),e->(char)e))
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()
        .mapToObj(i -> (char) i)
        .collect(Collectors.toMap(i -> Character.hashCode(i), Function.identity()));
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()));
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()
    .mapToObj(ch -> (char) ch)
    .collect(Collectors.toMap(Object::hashCode, Function.identity()));