Lambda Java 8函数式编程,收集流的输出,类型为List<;MyCustomType>;?

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>

我有一个简单的for循环,它在一些自定义数据对象上循环,并执行一些基本的if/else条件逻辑,我试图使用streamapi/lambas编写这个循环,但遇到了一些问题。下面是我的代码:

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”Does
objThatConvertsMsgToMyCustomType.convert(msg)
是否真的返回整个列表?因为您没有添加到任何列表中,所以您正在用该调用的返回类型替换“应答”列表。
msg
从何而来?@polygenome Yes,
objThatConvertsMsgToMyCustomType.convert(msg)
返回一个数据类型的列表。我只是为数据类型使用了一个通用占位符,所以问题很简单,我想你可以把它看作是一个“学生”对象列表,比如
list
为什么它会生成一个列表?
Stream::map(函数)
生成一个
,该流收集到
列表
。您传递了一个
函数
。将
列表
替换为
B