Lambda Java 8函数式编程,收集流的输出,类型为List<;MyCustomType>;?
我有一个简单的for循环,它在一些自定义数据对象上循环,并执行一些基本的if/else条件逻辑,我试图使用streamapi/lambas编写这个循环,但遇到了一些问题。下面是我的代码:Lambda Java 8函数式编程,收集流的输出,类型为List<;MyCustomType>;?,lambda,java-8,functional-programming,java-stream,Lambda,Java 8,Functional Programming,Java Stream,我有一个简单的for循环,它在一些自定义数据对象上循环,并执行一些基本的if/else条件逻辑,我试图使用streamapi/lambas编写这个循环,但遇到了一些问题。下面是我的代码: private List<MyCustomDataType> myFunction(Object msg) { EventGridMessage eventGridMessage = filterData(msg); List<RandomDataType>
private List<MyCustomDataType> myFunction(Object msg) {
EventGridMessage eventGridMessage = filterData(msg);
List<RandomDataType> streamList = randomObject.converter(eventGridMessage, logger);
return streamList.stream().map( i -> {
List<MyCustomDataType> answer = new ArrayList<>();
if (i.name != null) {
if (i.date > 2020) {
// if in this branch, convert method returns List<MyCustomDataType>
answer= objThatConvertsMsgToMyCustomType.convert(msg);
}
}
else if (i.getdate < 2020) {
// if in this branch, convert method returns List<MyCustomDataType>
answer = objThatConvertsMsgToMyCustomType.convert(msg);
}
return answer;
}).collect();
private List myFunction(Object msg){
EventGridMessage EventGridMessage=filterData(msg);
List streamList=randomObject.converter(eventGridMessage,logger);
返回streamList.stream().map(i->{
列表答案=新建ArrayList();
如果(i.name!=null){
如果(i.日期>2020年){
//如果在这个分支中,convert方法返回List
答案=objthatconvertsgsgtomycustomtype.convert(msg);
}
}
否则如果(i.getdate<2020){
//如果在这个分支中,convert方法返回List
答案=objthatconvertsgsgtomycustomtype.convert(msg);
}
返回答案;
}).收集();
因此,您可以看到,我基本上希望使用流API迭代随机数据类型
对象的列表
(称为streamList),并根据if/else分支中满足的某些条件,将它们添加到一个名为answer
的新列表中,我在lambda主体中定义为local(objthattconvertsmsgtomycustomtype.convert(msg)方法返回一个新列表)。然后,我只想从该方法返回此列表,因为它与我的方法签名匹配,但在“收集”时遇到问题这个结果列表。我假设我在这里选择map是正确的,而不是forEach
,我考虑过在条件if/else上使用filter
,但我不知道如何用我的逻辑分支的方式和它应该返回列表
数据类型的事实来实现这一点
有人能帮我吗?您正在生成一个
列表,其中需要一个列表
。简单的解决方法是使用flatMap
如果
s进入过滤器,我会重新编写你的
private List<MyCustomDataType> myFunction(Object msg) {
EventGridMessage eventGridMessage = filterData(msg);
List<RandomDataType> items = randomObject.converter(eventGridMessage, logger);
return items.stream()
.filter(item -> ((item.name != null) && (item.date > 2020)) || (item.date < 2020))
.flatMap(objThatConvertsMsgToMyCustomType.convert)
.collect();
}
private List myFunction(Object msg){
EventGridMessage EventGridMessage=filterData(msg);
列表项=randomObject.converter(eventGridMessage,logger);
returnitems.stream()
.filter(item->((item.name!=null)和&(item.date>2020))| |(item.date<2020))
.flatMap(objThatConvertsMsgToMyCustomType.convert)
.收集();
}
什么是alarmSpans
?@Polygenome抱歉,这是打字错误。它应该是“streamList”DoesobjThatConvertsMsgToMyCustomType.convert(msg)
是否真的返回整个列表?因为您没有添加到任何列表中,所以您正在用该调用的返回类型替换“应答”列表。msg
从何而来?@polygenome Yes,objThatConvertsMsgToMyCustomType.convert(msg)
返回一个数据类型的列表。我只是为数据类型使用了一个通用占位符,所以问题很简单,我想你可以把它看作是一个“学生”对象列表,比如list
为什么它会生成一个列表?Stream::map(函数)
生成一个流
,该流收集到列表
。您传递了一个函数
。将列表
替换为B