如果为空,是否执行某个事件:
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、逐一打印。代码 中并没有体现使用线性循环或是其他任何算法进行遍历,我们真正要做的事情内容被更好地体现在代码中。
随笔,如果错误欢迎指出