> 文章列表 > 第十节 Java工具包-Collections 流--lambada表达式

第十节 Java工具包-Collections 流--lambada表达式

第十节 Java工具包-Collections 流--lambada表达式

 collection为核心的接口,包含了多种不同类型的集合以及多种不同数据结构的实现的类

list  set .add

package cn.nefu.com;
import java.util.List;
import java.util.ArrayList;
import java.util.AbstractMap;
public class S47 {public static void main(String[] args){List<String> list=new ArrayList();//jdk1.8之后不用写list.add("aaa");//有序list.add("bbb");list.add("ccc");for(int i=0;i<list.size();i++){System.out.println(list.get(i));}for(String s:list){System.out.println(s);}}
}

list中的元素是有序的 list集合自己就做好了排序  list还可以包含重复元素,因为它 带有标号

list是接口 所以不能实例化出对象 要去帮助文档中去找基本实现的类  有很多 比较常见的如ArrayList(实现类)

list集合怎么取出元素,完成迭代?

1.利用list.size()方法 

2.利用for each语句 第一节课也讲过哦

其实for each语句就相当于类的封装了,便于使用  表示从list集合中取出元素,知道集合里面没有元素为止

注意:集合list当中可以放任何类型的元素,整型啊 double 字符串都可以 我们为了便于迭代取出元素还为了让集合中的元素有约束所以引入了泛型的概念

 当试图向集合中添加 不匹配类型对象时 编译错误

因为集合中不关心元素的具体类型,所以引出泛型  <E> 装的引用类型

当声明元素类型为基本数据类型而不是引用数据类型时 编译出错

int double 数据类型   对所有基本数据类型进行封装  Integer Double

提供双精度浮点数的一些方法

int    Integer.parseInt();

字符转成字符串

字符串转字符

集合list怎么去遍历  怎么去找

集合  怎么放怎么取   ?   迭代

迭代器功能   迭代器遍历

map引用对象-------它是接口 要用实现的类去new  put get

map集合遍历    去找这个里面有多少个键值

keyset  获得键值  for each   之后根据每一个键值输出每一个键值所对应的值

jdk1.8之后又遍历----函数式编程   函数

函数式编程算是java中的另类了 

Lambada表达式-----Lambada允许把函数作为一个方法的参数(函数作为参数传到方法中)

lambada表达式不是单独存在的 它要和函数式接口/函数式编程结合在一起

(arg1, arg2) -> expression(函数体语句)

(arg1, arg2) -> {body}//无函数名  只使用

java.util.stream.Stream<T>接口 鉴于Java对集合操作的复杂性,Java8中引入Stream API,用于操作处理集合中的元素  有了这个流可以快速的对集合进行依次的遍历和操作   例如选择集合中的值,例如给集合中的值排序---------对集合中的元素进行流式的操作,改变了元素,没有改变集合中的元素值(不会回写到集合中)

对流的使用要用到lambada表达式

我们的流中就采用了函数式接口

package com.example21.collectionstream;public class Apple {public enum Color{RED, GREEN}private int id;private Color color;private int weight;public Apple(int id, Color color, int weight) {this.id = id;this.color = color;this.weight = weight;}public int getId() {return id;}public void setId(int id) {this.id = id;}public Color getColor() {return color;}public void setColor(Color color) {this.color = color;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}
}
package com.example21.collectionstream;import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class StreamTest {private static final List<Apple> APPLES = create();private static List<Apple> create() {Apple a = new Apple(1, Apple.Color.RED, 200);Apple a2 = new Apple(2, Apple.Color.GREEN, 250);Apple a3 = new Apple(3, Apple.Color.RED, 260);Apple a4 = new Apple(4, Apple.Color.GREEN, 230);List<Apple> apples = new ArrayList<>();apples.add(a);apples.add(a2);apples.add(a3);apples.add(a4);return apples;}public static void main(String[] args) {// forEach();/*filter(Apple.Color.RED).forEach(a -> System.out.println(a.getId()));*/// map();// sorted();// sortedReversed();// collect();collectGroupingBy2();}/* foreach循环* forEach()方法,简写*/private static void forEach() {for (Apple a : APPLES) {System.out.println(a.getWeight());}APPLES.forEach(a -> System.out.println(a.getWeight()));}/* 原实现。返回指定颜色的全部苹果*/private static List<Apple> getRedApples(Apple.Color c) {List<Apple> reds = new ArrayList<>();for (Apple a : APPLES) {if (c == a.getColor()) {reds.add(a);}}return reds;}/* 基于stream的过滤* 修改方法返回值,方法链* 比较源/新集合 @param c*/private static List<Apple> filter(Apple.Color c) {return APPLES.stream().filter(a -> a.getColor() == c).collect(Collectors.toList());}/* 过滤指定颜色,且大于等于指定重量的苹果。2次过滤 @param c* @param weight*/private static void filter(Apple.Color c, int weight) {APPLES.stream().filter(a -> a.getColor() == c).filter(a -> a.getWeight() >= weight).collect(Collectors.toList()).forEach(a -> System.out.println(a.getId()));}/* 将重量映射为新集合,遍历打印* 简写*/private static void map() {APPLES.stream().map(Apple::getWeight).collect(Collectors.toList()).forEach(System.out::println);}/* 以重量顺序排序*/private static void sorted() {APPLES.stream().sorted(Comparator.comparing(Apple::getWeight)).collect(Collectors.toList()).forEach(a -> System.out.println(a.getWeight()));}/* 以ID逆序排序*/private static void sortedReversed() {APPLES.stream().sorted(Comparator.comparing(Apple::getId).reversed()).collect(Collectors.toList()).forEach(a -> System.out.println(a.getId()));}/* 获取颜色,分别按list/set聚合*/private static void collect() {APPLES.stream().map(Apple::getColor).collect(Collectors.toSet()).forEach(System.out::println);}/* Map操作。基于颜色分组*/private static void collectGroupingBy() {Map<Apple.Color, List<Apple>> map = APPLES.stream().collect(Collectors.groupingBy(Apple::getColor));}/* 以ID为键,苹果对象为值。自定义键值对* forEach遍历*/private static void collectGroupingBy2() {APPLES.stream().collect(Collectors.toMap(Apple::getId, a -> a)).forEach((k, v) -> {System.out.println(k + "/" + v.getColor());});}/* 函数中,只能操作函数体外的常量*/private static void finalValue() {int count = 0;APPLES.forEach(a -> {System.out.println(count);});}/* 2组过滤相同*/private static void getFilter() {Apple a1 = new Apple(1, Apple.Color.RED, 200);Apple a2 = new Apple(5, Apple.Color.GREEN, 240);List<Apple> newApples = List.of(a1, a2);List<Apple> oldApples = APPLES;List<Apple> apples = new ArrayList<>();for (Apple a : newApples) {for (Apple oa : oldApples) {if (a.getId() == oa.getId()) {apples.add(a);}}}apples.forEach(a -> System.out.println(a.getId()));System.out.println("--------------");List<Apple> apples2 = newApples.stream().filter(a -> oldApples.stream().anyMatch(oa -> oa.getId() == a.getId())).collect(Collectors.toList());apples2.forEach(a -> System.out.println(a.getId()));}
}

利用foreach方法  lambada表达式 配合  形参赋值

函数调用四次  形参名字随便

集合中都有这个方法  取值放函数形参里 形参输出  经常用 触发函数四次

集合流  不管存储  操作集合元素通道  筛选工作和获取流

利用流的方式去选苹果  苹果选颜色   按照函数规则去遍历

package cn.nefu.com;
import java.util.List;
import java.util.ArrayList;
import java.util.AbstractMap;
import java.util.inerator;
public class S47 {public static void main(String[] args){List<String> list=new ArrayList();//jdk1.8之后不用写list.add("aaa");//有序list.add("bbb");list.add("ccc");for(int i=0;i<list.size();i++){System.out.println(list.get(i));}for(String s:list){System.out.println(s);}Iterator<String> iterater=list.iterator();//迭代器  模拟集合一次往下查询//获取迭代器while(iterator.hasNext()){System.out.println(iterator.next());}Map<Strint,Integer> map=new HashMap();map.put("200000",233)//自己指定键值   键值区别开value可以重复for()}
}