flatMap 方法是否只展平流而不映射它?
Does flatMap method only flattens the stream and not map it?
我看到到处都写着 flatMap 展平和映射流,但实际上例如在下面的程序中仅使用 flatMap 我们无法执行映射操作(将其更改为大写)。这里需要单独使用map方法
List<String> uppercase = Stream.of(asList("A", "B"), asList("C", "D"))
.flatMap(List::stream)
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(uppercase);
我对flatMap的理解有误吗?任何人都可以帮助理解这一点 - flatMap 是只展平流还是可以展平和映射两者?如果是这样,那么我们如何为此编写代码?
限制你的只是那些特定的方法参考。使用 lambda 表达式,您仍然可以同时执行这两项操作:
.flatMap(list -> list.stream().map(String::toUpperCase))
.collect(Collectors.toList());
我应该提一下,限制你的只是方法引用的顺序,而不是用方法引用做不到。关键是您传递给它的映射器。以这些为例:
Stream<String> uppercaseArray(String[] a) {
return Arrays.stream(a).map(String::toUpperCase);
}
Stream.of(new String[] {"ab"}, new String[] {"cd", "ef"})
.flatMap(this::uppercaseArray); //map and transform
// Or a completely different perspective
Stream.of("abc", "def").flatMapToInt(String::chars);
为了更好地理解,请参阅两种情况下的 return 类型差异。
Stream<Stream<String>> i = listOfList.stream().map(li->li.stream());
Stream<String> j = listOfList.stream().flatMap(li->li.stream());
Stream<String> stream1 = Stream.of("A", "B");
Stream<String> stream2 = Stream.of("C", "D");
Stream<Stream<String>> result1 = Stream.of(stream1,stream2).map(str->str.map(s->s.toUpperCase()));
Stream<String> result2 = Stream.of(stream1,stream2).flatMap(str->str.map(s->s.toUpperCase()));
我看到到处都写着 flatMap 展平和映射流,但实际上例如在下面的程序中仅使用 flatMap 我们无法执行映射操作(将其更改为大写)。这里需要单独使用map方法
List<String> uppercase = Stream.of(asList("A", "B"), asList("C", "D"))
.flatMap(List::stream)
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(uppercase);
我对flatMap的理解有误吗?任何人都可以帮助理解这一点 - flatMap 是只展平流还是可以展平和映射两者?如果是这样,那么我们如何为此编写代码?
限制你的只是那些特定的方法参考。使用 lambda 表达式,您仍然可以同时执行这两项操作:
.flatMap(list -> list.stream().map(String::toUpperCase))
.collect(Collectors.toList());
我应该提一下,限制你的只是方法引用的顺序,而不是用方法引用做不到。关键是您传递给它的映射器。以这些为例:
Stream<String> uppercaseArray(String[] a) {
return Arrays.stream(a).map(String::toUpperCase);
}
Stream.of(new String[] {"ab"}, new String[] {"cd", "ef"})
.flatMap(this::uppercaseArray); //map and transform
// Or a completely different perspective
Stream.of("abc", "def").flatMapToInt(String::chars);
为了更好地理解,请参阅两种情况下的 return 类型差异。
Stream<Stream<String>> i = listOfList.stream().map(li->li.stream());
Stream<String> j = listOfList.stream().flatMap(li->li.stream());
Stream<String> stream1 = Stream.of("A", "B");
Stream<String> stream2 = Stream.of("C", "D");
Stream<Stream<String>> result1 = Stream.of(stream1,stream2).map(str->str.map(s->s.toUpperCase()));
Stream<String> result2 = Stream.of(stream1,stream2).flatMap(str->str.map(s->s.toUpperCase()));