【发布时间】:2020-05-04 22:26:40
【问题描述】:
import java.util.*;
import java.util.stream.*;
class Playground {
public static void main(String[] args)
{
// Creating a character array
char arr[] = { '1', '2', '3', '4', '5' };
// --------- Using Stream.of() ---------
// Will work efficiently
// to convert int array into Stream
Stream<char[]> stream = Stream.of(arr);
Stream<Integer> s = stream.flatMap((item)->new String(item).chars().mapToObj(a->(char)a));
// Displaying elements in Stream
s.forEach(str -> System.out.print(str + " "));
}
}
我正在尝试使用 flatMap() 将 char[] 转换为字符流,但出现以下错误
./Playground/Playground.java:14: error: incompatible types: inference variable R has incompatible bounds
Stream<Integer> s = stream.flatMap((item)->new String(item).chars().mapToObj(a->(char)a));
^
equality constraints: Integer
lower bounds: U,Character
where R,T,U are type-variables:
R extends Object declared in method <R>flatMap(Function<? super T,? extends Stream<? extends R>>)
T extends Object declared in interface Stream
U extends Object declared in method <U>mapToObj(IntFunction<? extends U>)
1 error
需要帮助以了解错误以及如何完成此任务。具体如何使用 flatMap() 从 char[] 到字符流来修复这行代码。
Stream<Integer> s = stream.flatMap((item)->new String(item).chars().mapToObj(a->(char)a))
编辑:所以问题不是关于 Stream 而是关于 lambda 表达式,我在意外修复 lambda 表达式后抽搐了线路并弄乱了打字。原行是
Stream<Character> s = stream.flatMap(item->{new String(item).chars().mapToObj(a->(char)a);});
问题是 {} 中缺少 return 语句。然后我把这条线改成了
Stream<Integer> s = stream.flatMap((item)->new String(item).chars())
因为我认为 IntStream::mapToObj 造成了麻烦但是我最后忘记了 boxed() 并得到了另一个类型错误,所以我添加了 IntStream::mapToObj 并发布了问题但忘记将 Stream 类型更改回特点。我很困惑,但现在雾已经散去。谢谢你的好答案。
【问题讨论】:
-
只要
Arrays.stream(array)。 -
@WJS 不适用于
char[]。 -
@Holger Nuts!也不是
short[]也不是byte[]。我一直忘记这些类型没有重载。我必须在下面修改我的答案才能修复。非常感谢! -
谢谢大家。所以问题原来不是关于 Stream 而是关于 lambda 表达式,我在意外修复 lambda 表达式后抽搐了线路并弄乱了打字。原行是“Stream
s = stream.flatMap(item->{new String(item).chars().mapToObj(a->(char)a);});”问题是 {} 中缺少 return 语句。我在更改线路后创建了新错误,并且错误消息有点模糊,对我来说很糟糕。再次感谢您的好答案:)
标签: java java-stream lambda