有人可以向我解释一下map和flatMap之间的区别以及每个的好用例是什么?
什么"压扁结果"是什么意思?到底有什么好处呢?
这两种方法有什么区别:Optional.flatMap()和Optional.map()?
一个例子将不胜感激.
我一直在检查即将到来的Java update,即:Java 8 or JDK 8.是的,我很不耐烦,有很多新东西,但是,有一些我不明白的东西,一些简单的代码:
final Stream<Integer>stream = Stream.of(1,2,3,4,5,6,7,8,9,10);
stream.flatMap();
Run Code Online (Sandbox Code Playgroud)
javadoc是
public <R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)返回一个流,该流包含将此流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容的结果.每个映射的流在其内容放入此流后关闭.(如果映射的流为空,则使用空流.)这是一个中间操作.
如果有人创建了一些简单的现实生活示例flatMap,如何在以前的java版本Java[6,7]中编写代码以及如何使用相同的例程编写代码,我将不胜感激Java 8.
我有两个数字列表,我想找到所有可能的数字对.例如,给定列表[1,2,3]和[3,4],结果应该是[(1,3),(1,4),(2,3),(2,4),(3) ,3),(3,4)].
我知道我可以使用for循环来做到这一点,但有没有更简洁的方法来使用Java 8流?
我试过以下但是我错过了一些东西,因为我得到了List<Stream<int[]>>而不是List<int[]>.
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(3, 4);
List<int[]> pairs = list1.stream().map(i -> list2.stream().map(j -> new int[] { i, j }))
.collect(Collectors.toList());
pairs.forEach(i -> {
System.out.println("{" + i[0]+ "," + i[1]+ "}");
});
}
Run Code Online (Sandbox Code Playgroud) 我希望能够像这样使用Stream :: flatMap
public static List<String> duplicate(String s) {
List<String> l = new ArrayList<String>();
l.add(s);
l.add(s);
return l;
}
listOfStrings.stream().flatMap(str -> duplicate(str)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是我得到以下编译器错误
Test.java:25:错误:不兼容的类型:无法推断类型变量R listOfStrings.stream().flatMap(str - > duplicate(str)).collect(Collectors.toList());
(参数不匹配; lambda表达式中的错误返回类型List无法转换为Stream)
其中R,T是类型变量:R extends方法flatMap中声明的Object(Function>)T extends Interface在Interface Stream中声明的Object
在scala我可以做我认为相同的事情
scala> List(1,2,3).flatMap(duplicate(_))
res0: List[Int] = List(1, 1, 2, 2, 3, 3)
Run Code Online (Sandbox Code Playgroud)
为什么这不是java中flatMap的有效用法?
我有这样的课
public class Example {
private List<Integer> ids;
public getIds() {
return this.ids;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我有这样的类的对象列表
List<Example> examples;
Run Code Online (Sandbox Code Playgroud)
我怎样才能将所有示例的id列表映射到一个列表中?我试过这样的:
List<Integer> concat = examples.stream().map(Example::getIds).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但得到一个错误 Collectors.toList()
使用Java 8 stream api获得此功能的正确方法是什么?
例如,我有一个名字和姓氏的人.
我想从人员列表中收集一个字符串列表(姓名和姓氏),但似乎我不能每个列表使用两次地图或者每个列表不能使用两次流.我的代码是:
persons.stream()
.map(Person::getName)
.collect(Collectors.toSet())
.stream().map(Person::getSurname)
.collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)
但它一直告诉我,Person静态方法不能引用非静态方法.
我究竟做错了什么?
请考虑以下代码:
urls.stream()
.flatMap(url -> fetchDataFromInternet(url).stream())
.filter(...)
.findFirst()
.get();
Run Code Online (Sandbox Code Playgroud)
fetchDataFromInternet当第一个足够的时候会被叫第二个网址吗?
我尝试了一个较小的例子,看起来像预期的那样工作.即逐个处理数据但是可以依赖这种行为吗?如果没有,请.sequential()在.flatMap(...)帮助前打电话吗?
Stream.of("one", "two", "three")
.flatMap(num -> {
System.out.println("Processing " + num);
// return FetchFromInternetForNum(num).data().stream();
return Stream.of(num);
})
.peek(num -> System.out.println("Peek before filter: "+ num))
.filter(num -> num.length() > 0)
.peek(num -> System.out.println("Peek after filter: "+ num))
.forEach(num -> {
System.out.println("Done " + num);
});
Run Code Online (Sandbox Code Playgroud)
输出:
Processing one
Peek before filter: one
Peek after filter: one
Done one
Processing two
Peek before filter: two
Peek after filter: …Run Code Online (Sandbox Code Playgroud) 我有一个Model具有以下签名的课程:
class Model {
private String stringA;
private String stringB;
public Model(String stringA, String stringB) {
this.stringA = stringA;
this.stringB = stringB;
}
public String getStringA() {
return stringA;
}
public String getStringB() {
return stringB;
}
}
Run Code Online (Sandbox Code Playgroud)
我想将a映射List<Model>到List<String>包含stringA和stringB的单个流中
List<String> strings = models.stream()
.mapFirst(Model::getStringA)
.thenMap(Model::getStringB)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
要么:
List<String> strings = models.stream()
.map(Mapping.and(Model::getStringA,Model::getStringB))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
当然,他们都没有编译,但你明白了.
它有可能吗?
编辑:
例:
Model ab = new Model("A","B");
Model cd = new Model("C","D");
List<String> stringsFromModels = {"A","B","C","D"};
Run Code Online (Sandbox Code Playgroud) 我的目标正是标题所说的.我在做的是:
.stream().flatMap(x -> x.getTitles())
Run Code Online (Sandbox Code Playgroud)
getTitles()返回一个LinkedList<String>,我期望flatMap()完成这项工作并创建一个字符串流而不是一个流LinkedList<String>,但Eclipse说:
类型不匹配:无法转换
LinkedList<String>为Stream<? extends Object>
我怎样才能做到这一点?(我需要用流做,它是更大的流计算的一部分)