无法解析Java流中的方法Character::hashCode
在我的示例中,我尝试从一系列字符创建一个ASCII表。我设法用字符串的无法解析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
列表来完成,但用字符数组失败了
我得到一个错误,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
映射到流。但是在此之后,您不能使用方法referenceCharacter::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()));