[英]Stream.flatMap() from char[] to Character stream
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[] 转换为 stream 字符,但出现以下错误
./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[] 到 Character stream 修复这行代码的。
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 类型改回 Character。 我很困惑,但迷雾现在已经清除了。谢谢你的好答案。
你快到了。 只需将Stream<Integer>
替换为Stream<Character>
,因为您正在转换为代码中的char
。
但是,关于您的代码的问题是您不必要地flatMap
ping 。 Stream.of
需要一个以引用类型作为其复合类型的数组。 此外, Arrays.stream
没有char[]
的重载。 您最终流式传输保证是单个元素的内容。 该元素是您的char[]
。
你可以放弃flatMap
操作,直接将 char 数组转换为 String。
String str = new String(arr);
Stream<Character> characterStream = str.chars().mapToObj(c -> (char) c);
目前尚不清楚您要通过这种不必要的操作绕行来实现什么。 当你想对数组进行 stream 时,只需从该操作开始,而不是创建单个元素 stream 来链接flatMap
,链接另一个map
。
您的代码确实已经包含一种使用String
构造函数在其他操作中间流过char[]
数组的方法。
char[] arr = { '1', '2', '3', '4', '5' };
new String(arr).chars().forEach(i -> System.out.print(i + " "));
这将打印 Unicode 数字。 当你想改为打印字符时,只需更改终端操作:
new String(arr).chars().forEach(i -> System.out.print((char)i + " "));
要么
new String(arr).chars().forEach(i -> System.out.printf("%c ", i));
您也可以使用
new String(arr).chars().mapToObj(i -> (char)i).forEach(i -> System.out.print(i+" "));
但这会产生装箱开销,因为它创建了一个Stream<Character>
。
请注意, new String(arr)
会产生复制开销,因为它会创建一个不可变的 object。您可以通过使用来避免这种情况
CharBuffer.wrap(arr).chars().forEach(i -> System.out.printf("%c ", i));
当然,你可以插入任意多的花体,例如
Stream.of(arr)
.flatMapToInt(array -> CharBuffer.wrap(array).chars())
.mapToObj(i -> (char)i) // returns a Stream<Character> not Stream<Integer>
.forEach(i -> System.out.printf("%c ", i));
但没有理由这样做。
Arrays.stream()
用于除 byte、char 或 short 之外的任何数组。*Stream.of()
用于类型 * 的任何原始数组,其中 * 是 Int 或 Double,或 Long。Stream.of()
。以下所有工作如上所述。
Integer[] IntegerArray = {1,2,3,4};
Arrays.stream(IntegerArray).forEach(System.out::println);
Stream.of(IntegerArray).forEach(System.out::println);
int[] intArray = {1,2,3,4};
Arrays.stream(intArray).forEach(System.out::println);
IntStream.of(intArray).forEach(System.out::println);
double[] doubleArray = {1.2,3.3,4.5,6.7};
Arrays.stream(doubleArray).forEach(System.out::println);
DoubleStream.of(doubleArray).forEach(System.out::println);
String[] stringArray = {"a","b","c","d"};
Stream.of(stringArray).forEach(System.out::println);
要解决您的实际问题,请尝试此操作。
// 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);
// Displaying elements in Stream
s.forEach(str -> System.out.print(str + " "));
Stream<Integer> s = stream.flatMapToInt((item)->(new String(item)).chars()).boxed();
//or
IntStream s = stream.flatMapToInt((item)->(new String(item)).chars());
// Displaying elements in Stream
s.forEach(str -> System.out.print((char)str + " "));
您使用Stream<Integer>
而不是Stream<Character>
。 如果要使用Stream<Integer>
,则需要使用IntStream::boxed或mapToObj(a -> Integer.valueOf(a))
,如下所示:
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
char arr[] = { '1', '2', '3', '4', '5' };
Stream<char[]> stream1 = Stream.of(arr);
Stream<Character> chars = stream1.flatMap(item -> new String(item).chars().mapToObj(a -> (char) a));
chars.forEach(c -> System.out.print(c + " "));
System.out.println();
Stream<char[]> stream2 = Stream.of(arr);
Stream<Integer> ints = stream2.flatMap(item -> new String(item).chars().boxed());
ints.forEach(i -> System.out.print(i + " "));
System.out.println();
Stream<char[]> stream3 = Stream.of(arr);
Stream<Integer> integers = stream3.flatMap(item -> new String(item).chars().mapToObj(a -> Integer.valueOf(a)));
integers.forEach(i -> System.out.print(i + " "));
}
}
Output:
1 2 3 4 5
49 50 51 52 53
49 50 51 52 53
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.