Java基础之lambda与Stream流,期末面试必会

JDK1.8新特性(继JDK1.5后革命性的LTS版本)

面向对象特点:一切事物都是对象.弊端是必须创建对象,在对象中创建方法.这个过程麻烦.

函数式编程思想,忽略面向对象复杂的语法,强调做什么而不是什么形式去做.思想核心:

**可推导的,**就是可省略的.更为简洁.python中对这一思想有很好的体现.

JDK1.8中新增的Lambda表达式和Stream流就是函数式编程思想的应用.

Lambada表达式

标准格式: (参数类型 参数名 ) -> {代码语句;}

Java基础之lambda与Stream流,期末面试必会_第1张图片

函数式接口:

加了注解**@FunctionalInterface**的接口就是函数式接口,该接口内只可以写一个抽象方法.

Java基础之lambda与Stream流,期末面试必会_第2张图片

自定义一个方法,让这个方法可以接受Lambda表达式

Java基础之lambda与Stream流,期末面试必会_第3张图片

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 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);

}


你可能感兴趣的:(java,面试,python)