Java8中,Stream数据流操作对集合操作做了极大的简化,学习了Stream,以后我们可以不用for循环就能对集合进行很多操作。
Java中所有的Stream操作,都是针对流对象的,故使用Stream必须得初始化得到Stream类型对象:
Stream初始化:
Stream stream = Stream.of("a","b","c");
数组转换为Stream:
String [] strArray = new String[]{"a","b","c"};
Stream stream = Stream.of(strArray);
//或者
Stream stream = Arrays.stream(strArray);
集合对象转换为Stream:
List<String> list = Arrays.asList(strArray);
stream = list.stream();
使用map操作可以遍历集合中的每个对象,并对其操作;
map操作后,使用.collect(Collectors.toList())
可以得到操作后的集合。
eg:
//1.1 遍历并转换为大写
List output = wordList.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
//1.2 对每个元素进行平方计算
List nums = Arrays.asList(1,2,3,4);
List squareNums = nums.stream()
.map(n->n*n)
.collect(Collectors.toList());
利用filter可以对Stream中的数据元素进行过滤,通过过滤的元素会保留下来生成一个新的Stream。
List<String> filterLists = new ArrayList<>();
filterLists.add("");
filterLists.add("a");
filterLists.add("b");
List afterFilterLists = filterLists.stream()
.filter(s->!s.isEmpty())
.collect(Collectors.toList());
对Stream中的每个对象进行自定义操作,可使用forEach:
List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.stream().forEach(s->System.out.println(s));
List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.add("d");
forEachLists.add("e");
forEachLists.add("f");
List<String> limitLists = forEachLists.stream()
.skip(2)
.limit(3)
.collect(Collectors.toList());
//先跳过前2个元素
//再取Stream剩余元素的前3,生成新的Stream并返回
//1.对集合排序
List<Integer> sortLists = new ArrayList<>();
sortLists.add(1);
sortLists.add(4);
sortLists.add(6);
sortLists.add(3);
sortLists.add(2);
List<Integer> afterSortLists = sortLists.stream()
.sorted((In1,In2)->In1-In2)
.collect(Collectors.toList());
//2.获取最大长度的元素
List<String> maxLists = new ArrayList<>();
maxLists.add("a");
maxLists.add("b");
maxLists.add("c");
maxLists.add("d");
maxLists.add("e");
maxLists.add("f");
maxLists.add("hahaha");
int maxLength = maxLists.stream() //获取列表中最长元素的长度
.mapToInt(s->s.length())
.max().getAsInt();
//3.对集合进行查重
List<String> distinctList = new ArrayList<>();
distinctList.add("a");
distinctList.add("a");
distinctList.add("c");
distinctList.add("d");
List<String> afterDistinctList = distinctList.stream()
.distinct()//去重
.collect(Collectors.toList())
有时,我们需要判断集合中是否全部满足条件,或判断集合中是否存在满足条件的元素,此时就可以使用match方法:
List<String> matchList = new ArrayList<>();
matchList.add("a");
matchList.add("");
matchList.add("a");
matchList.add("c");
matchList.add("d");
//1.判断集合中是否存在“c”的字符串元素
Boolean isExits = matchList.stream()
.anyMatch(s->s.equals("c"));
//2.判断集合中是否全不为空
Boolean isAllNull = matchList.stream()
.allMatch(s->s.isNotEmpty());
Boolean isAllNull2 = matchList.stream()
.noneMatch(s->s.isEmpty());