JDK1.8新特性(继JDK1.5后革命性的LTS版本)
面向对象特点:一切事物都是对象.弊端是必须创建对象,在对象中创建方法.这个过程麻烦.
函数式编程思想,忽略面向对象复杂的语法,强调做什么而不是什么形式去做.思想核心:
**可推导的,**就是可省略的.更为简洁.python中对这一思想有很好的体现.
JDK1.8中新增的Lambda表达式和Stream流就是函数式编程思想的应用.
Lambada表达式
标准格式: (参数类型 参数名 ) -> {代码语句;}
函数式接口:
加了注解**@FunctionalInterface**的接口就是函数式接口,该接口内只可以写一个抽象方法.
自定义一个方法,让这个方法可以接受Lambda表达式
Stream流.
获取流:
Collection: collection.stream()
Map: map.keySet.stream() map.values().stream() map.entrySet.stream()
Array: Arrays.stream(arr) Stream.of(arr)
中间方法:
过滤filter: Stream filter (Predicate super T > predicate )
Predicate函数式接口,里面的方法是 boolean test(T t ) .该方法返回true,filter留下当前元素.
映射:map 将当前流的数据进行一些操作(如类型转换),然后存入另一个流.
limit: 取用流的前几个数据
skip:跳过流的前几个数据
组合concat: Stream.concat(stream1,stream2);
终结方法:
forEach count collect(Collectors.toList());
注意点:流数据只可被用一次.不改变原来的数据
案例练习:
现在有两个 ArrayList 集合存储队伍当中的多个成员姓名,要求使用传统的for循环(或增强for循环)依次进行以下若干操作步骤:
1)第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中。
2)第一个队伍筛选之后只要前3个人;存储到一个新集合中。
3)第二个队伍只要姓张的成员姓名;存储到一个新集合中。
4)第二个队伍筛选之后不要前2个人;存储到一个新集合中。
5)将两个队伍合并为一个队伍;存储到一个新集合中。
6)根据姓名创建 Person 对象;存储到一个新集合中。
7)打印整个队伍的Person对象信息。
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
ArrayList<String> list2= new ArrayList<>();
Collections.*addAll*(list1,"岳飞","李世民","特朗普","费德提克");
Collections.*addAll*(list2,"张冰冰","张菜花","张芷若","西西");
List<String> result=
Stream.*concat*(list1.stream().filter(s -> s.length() == 3)
, list2.stream().filter(s -> s.startsWith("张")).skip(2))
.collect(Collectors.*toList*());
System.*out*.println(result);
}