Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可选列表和以下映射_Java_Performance_List_Lambda_Optional - Fatal编程技术网

Java 可选列表和以下映射

Java 可选列表和以下映射,java,performance,list,lambda,optional,Java,Performance,List,Lambda,Optional,我希望你很好 我遇到了一些涉及列表操作的场景。期望对该列表进行以下数据映射,并避免任何NPE。这将通过for循环和内部查询任何可能包含另一个列表的数据来完成,依此类推。考虑到性能,操作数据的最佳方法是什么。保持for循环会更好,还是我们可以使用optionals和lambda进行改进,或者至少匹配相同的性能? 例如: class MyObject { //Constructors private int id; private List<MySecondObject

我希望你很好

我遇到了一些涉及列表操作的场景。期望对该列表进行以下数据映射,并避免任何NPE。这将通过for循环和内部查询任何可能包含另一个列表的数据来完成,依此类推。考虑到性能,操作数据的最佳方法是什么。保持for循环会更好,还是我们可以使用optionals和lambda进行改进,或者至少匹配相同的性能?
例如:

class MyObject {
    //Constructors
    private int id;
    private List<MySecondObject> objList;
    private String data;
    //getters, setters
}
class MySecondObject {
    //Constructors
    private int id;
    private String desc;
    //getters, setters
}
public class MyClass {
    public static void main(String args[]) {
        List<MyObject> objList = getList();
        List<String> descList = new ArrayList<>();
        if(objList == null){
            return;
        }
        for(MyObject o : objList) {
            if(o.getData() == null || o.getData().isEmpty()){
                continue;
            }
            if(o.getObjList() != null) {
                for(MySecondObject s : o.getObjList()) {
                    if(s.getDesc() != null && !s.getDesc().isEmpty()) {
                        descList.add(s.getDesc());
                    }
                }
            }
        }
    }
}
类MyObject{
//建设者
私有int-id;
私有列表对象列表;
私有字符串数据;
//能手,二传手
}
类MySecondObject{
//建设者
私有int-id;
私有字符串描述;
//能手,二传手
}
公共类MyClass{
公共静态void main(字符串参数[]){
List objList=getList();
List descList=new ArrayList();
if(objList==null){
返回;
}
for(MyObject o:objList){
如果(o.getData()==null | | o.getData().isEmpty()){
继续;
}
如果(o.getObjList()!=null){
for(MySecondObject s:o.getObjList()){
如果(s.getDesc()!=null&!s.getDesc().isEmpty()){
添加(s.getDesc());
}
}
}
}
}
}
谢谢


祝您度过愉快的一天。

这正是您在代码中所做的,但使用流:

公共静态列表createDescList(列表对象列表){
返回可选的.ofNullable(objList).orElse(Collections.emptyList()).stream()
.filter(对象::非空)
.filter(obj->isNotEmpty(obj.getData())
.map(MyObject::getObjList)
.flatMap(列表::流)
.filter(对象::非空)
.filter(obj->isNotEmpty(obj.getDesc()))
.map(MySecondObject::getDesc)
.collect(Collectors.toList());
}
//TODO可以替换为org.apache.commons.lang3.StringUtils.isNotEmpty()或isNotBlank()
私有静态布尔值isNotEmpty(字符串str){
return str!=null&!str.isEmpty();
}

if(o.getObjList()==null)为什么要在
下中断
?你不是想继续吗?我已经编辑了打字错误,谢谢!是的,在中间预计“代码>中断< /代码>语句。看来这是typo@oleg.cherednik谢谢你的回复。因此,请您详细说明性能影响。另外,这是检查空值的最佳方法吗?我们可以在筛选器和映射中继承可选的吗?对不起,如果这是一个愚蠢的问题。谢谢我是一个老学童。所以,如果我真的担心性能,我会在没有流的情况下进行,因为我不确定内部实现。但99%的时间我都是这样,我想,在这种情况下,我会选择parallelStream。
public static List<String> createDescList(List<MyObject> objList) {
    return Optional.ofNullable(objList).orElse(Collections.emptyList()).stream()
                   .filter(Objects::nonNull)
                   .filter(obj -> isNotEmpty(obj.getData()))
                   .map(MyObject::getObjList)
                   .flatMap(List::stream)
                   .filter(Objects::nonNull)
                   .filter(obj -> isNotEmpty(obj.getDesc()))
                   .map(MySecondObject::getDesc)
                   .collect(Collectors.toList());
}

// TODO can be replaced with org.apache.commons.lang3.StringUtils.isNotEmpty() or isNotBlank()
private static boolean isNotEmpty(String str) {
    return str != null && !str.isEmpty();
}