函数式编程中如果如空是否执行某个方法,Stream流、方法引用

如果为空,是否执行某个事件:

public String   createUser(){

    // 这里的模拟数据是字符串,当然也可适用A方法是否有返回值来判断是否执行B方法
      String user=null;
    String ss="值";

    // orElse方法: 无论是否有值都执行
    user = Optional.ofNullable(user).orElse(createUser());

 

    // orElseGet方法: 当ss值为null时,返回createUser方法,

    // orElseGet方法: 当ss不为空的时候,则不执行createUser方法并返回user

    ss = Optional.ofNullable(user).orElseGet(() -> createUser());

}
public String   createUser(){
    System.out.println("黄金时代反间谍法就飞 ");
    return null;

}

 

 


传统集合的多步遍历代码 
几乎所有的集合(如 Collection 接口或 Map 接口等)都支持直接或间接的遍历操作。而当我们需要对集合中的元 素进行操作的时候,除了必需的添加、删除、获取外,典型的就是集合遍历。

例如:

List<String> list= new  ArrayList<>();
list.add("ABD");
list.add("ABCD");
list.add("AD");
list.add("ACD");
List<String> zhangList=new ArrayList<>();
for(String name : list) {
    if(name.startsWith("A")){
        zhangList.add(name);
    }
}
List<String> shortList=new ArrayList<>();
for(String name : zhangList){
    if(name.length()==3){
        shortList.add(name);
    }
}
for(String name : shortList){
    System.out.println(name);
}

这是一段非常简单的集合遍历操作:对集合中的每一个字符串都进行打印输出操作。 循环遍历的弊端 
Java 8的Lambda让我们可以更加专注于做什么(What),而不是怎么做(How),这点此前已经结合内部类进行 了对比说明。现在,我们仔细体会一下上例代码,可以发现:
for循环的语法就是“怎么做” for循环的循环体才是“做什么”
为什么使用循环?因为要进行遍历。但循环是遍历的唯一方式吗?遍历是指每一个元素逐一进行处理,而并不是从 第一个到最后一个顺次处理的循环。前者是目的,后者是方式。
试想一下,如果希望对集合中的元素进行筛选过滤:
1. 将集合A根据条件一过滤为子集B; 2. 然后再根据条件二过滤为子集C。 那怎么办?在Java 8之前的做法可能为:
 
}
 List<String> list= new  ArrayList<>();
    list.add("ABCDE");
    list.add("ABD");
    list.add("ABCD");
    list.add("AD");
    list.add("ACD");
    List<String> zhangList=new ArrayList<>();

    list.stream()
            .filter( s -> s.startsWith("A") )
             .filter( s->s.length()==3 )
             .forEach( System.out::println );
}
这段代码中含有三个循环,每一个作用不同:
1. 首先筛选所有包含字母A的变量;
2. 然后筛选长度为三个字的变量; 
3. 后进行对结果进行打印输出。

每当我们需要对集合中的元素进行操作的时候,总是需要进行循环、循环、再循环。这是理所当然的么?不是。循 环是做事情的方式,而不是目的。另一方面,使用线性循环就意味着只能遍历一次。如果希望再次遍历,只能再使 用另一个循环从头开始。
那,Lambda的衍生物Stream能给我们带来怎样更加优雅的写法呢? Stream的更优写法 
下面来看一下借助Java 8的Stream API,什么才叫优雅:
 
直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤A、过滤长度为3、逐一打印。代码 中并没有体现使用线性循环或是其他任何算法进行遍历,我们真正要做的事情内容被更好地体现在代码中。 

随笔,如果错误欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值