Java25Stream流:集合对象.stream()
Posted 码农编程录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java25Stream流:集合对象.stream()相关的知识,希望对你有一定的参考价值。
文章目录
1.Stream流引入: list.stream().filter
package com.itheima07.boot;
import java.util.ArrayList;
import java.util.List;
// 代码冗余: 1. 循环太多 2. 判断太多
public class StreamBootDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
//张集合
List<String> zhangList = new ArrayList<>();
for (String name : list) {
if (name.startsWith("张")) {
zhangList.add(name);
}
}
//短集合 : 张集合基础上,只要名字3个
List<String> shortList = new ArrayList<>();
for (String name : zhangList) {
if (name.length() == 3) {
shortList.add(name);
}
}
for (String name : shortList) { //遍历打印
System.out.println(name);
}
}
}
package com.itheima07.boot;
import java.util.ArrayList;
import java.util.List;
// Stream 流: 1. 基于函数式编程延伸出来的一种用法。 2. 作用: 简化 集合数据 处理过程中的代码冗余问题
public class StreamBootDemo02 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
list.stream().filter(name -> name.startsWith("张")) //name就是集合中的每个元素
.filter(name -> name.length() == 3).forEach(name-> System.out.println(name));
}
}
2.Stream流的获取:.stream(),Stream.of(array)
如下排除静态方法,ArrayList能用stream方法的话,是从Collection里继承这方法。
package com.itheima08.stream;
import com.sun.org.apache.bcel.internal.generic.NEW;
import java.util.*;
import java.util.stream.Stream;
/*
* Stream 流: Stream流对象的获取:
* 1. 集合
* Collection接口 默认方法 stream()
* 2. 数组
* Stream.of(T...); 使用这个
* Stream.of(T);
*/
public class StreamGetDemo {
public static void main(String[] args) {
Collection<String> coll = new HashSet<>();
Stream<String> stream = coll.stream();
//1111111111111111111111111111111111111111111111111111111111111111111111111111
HashMap<String, String> map = new HashMap<>();
// Set set = map.keySet();
// set.stream();
Stream<String> stream1 = map.keySet().stream();
Stream<Map.Entry<String, String>> stream2 = map.entrySet().stream();
//111111111111111111111111111111111111111111111111111111111111111111111111111
String[] array = {"a","b"};
Stream<String> stream3 = Stream.of(array);
Integer[] array2 = {1,2,3};
Stream<Integer> stream4 = Stream.of(array2); //T... -> T=Integer,把每个元素拆开。//泛型 必须是 引用类型
int[] array3 = {1,2,3};
//如果说数组要获取Stream流,不要用基本类型数组, 把整个数组当成一个元素无法拆开,不要用如下
Stream<int[]> stream5 = Stream.of(array3);// T -> T = int[]
}
}
3.Stream流的终结方法:list.stream().count()
package com.itheima09.method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Consumer;
/*
* Stream流的方法
* 1. 终结方法 : 不支持链式编程 (返回值: 基本类型)
* 2. 拼接方法 : 支持链式编程 (返回值: 当前类型,引用类型)
*
* 终结方法:
* 1.foreach
* void forEach(Consumer<? super T> action);
* 底层: 迭代器 , 需要消费参数(集合中每一个元素)
* 2.count
* long count() : 获取集合中的元素个数
*/
public class EndDemo {
public static void main(String[] args) {
// method(); //abc
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 5,3,2,4);
// for (Integer integer : list) { //list.for快捷
// System.out.println(integer);
// }
//11111111111111111111111111111111111111111111111111111111111111111111
//stream流打印,先获取stream流对象
/* list.stream().forEach(new Consumer<Integer>() {
@Override
public void accept(Integer t) {
System.out.println(t); //遍历打印list集合
}
});*/
//如下等于上面
// list.stream().forEach(t-> System.out.println(t));
//11111111111111111111111111111111111111111111111111111111111111111111
long count = list.stream().count();
System.out.println(count); //4
}
private static void method() {
// StringBuilder sb = new StringBuilder();
// StringBuilder sb2 = sb.append("a");
// StringBuilder sb3 = sb2.append("b");
StringBuilder sb = new StringBuilder();
sb.append("a").append("b").append("c").equals("abc"); //append拼接方法,equals终结方法,因为equals返回boolean基本类型,不能再调用方法
System.out.println(sb);
}
}
4.Stream流的拼接方法:Stream.concat
package com.itheima09.method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.function.Predicate;
import java.util.stream.Stream;
/*
* Stream的拼接方法
* 1. filter 过滤
* Stream<T> filter(Predicate<? super T> predicate);
* 1. Predicate : public boolean test(String s)
* 2. s是集合中每一个元素 , 迭代器
* 3. return true : 表示保留这个元素
* 2. limit 取用前几个
* Stream<T> limit(long count)
* 只要前count个元素, 没有越界
* 3. skip 跳过前几个
* Stream<T> skip(long n);
* 4. static concat 组合,静态方法
* static <T> Stream<T> concat(Stream<T> a, Stream< T> b)
* 合并两个stream,整合一个stream
*/
public class ChainDemo { //Chain:链
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张三","张三丰","李四","李世石");
//.filter返回值类型是stream,调完filter还能调filter,就像Stringbuild调完append还可再调append
// list.stream().filter(new Predicate<String>() {
// @Override
// public boolean test(String s) {
// return s.startsWith("张");
// }
// }).forEach(s -> System.out.println(s)); //张三 张三丰
// list.stream().filter(s->s.startsWith("张")).forEach(s-> System.out.println(s)); //等同上面
// list.stream().limit(5).forEach(t-> System.out.println(t)); //没有索引越界,因为迭代器没有索引,最多4个就给4个
// list.stream().skip(3).forEach(t-> System.out.println(t)); //李世石
ArrayList<String> list2 = new ArrayList<>();
Collections.addAll(list2,"王五","王五百","马六");
Stream<String> stream1 = list.stream();
Stream<String> stream2 = list2.stream();
Stream.concat(stream1,stream2).forEach(t-> System.out.println(t)); //张三...7个元素
}
}
5.Stream源码分析:consumer.accept
package com.itheima10.source;
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;
import java.util.function.Predicate;
public class MyStream {
Collection<String> coll; //属性
public MyStream(Collection<String> coll){
this.coll = coll;
}
public void forEach(Consumer<String> consumer){
for (String s : coll) { //快捷键coll.foreach
consumer.accept(s); //接口调用方法执行子类重写的方法即下面SourceDemo.java中System.out.println(t),s就是t,
}
}
public MyStream filter(Predicate<String> predicate){
ArrayList<String> list = new ArrayList<>(); //list集合只添加 推断结果true的元素,新的
for (String s : coll) {
boolean result = predicate.test(s); //打印,父类引用调用方法执行子类重写方法即下面SourceDemo.java中t.length()==2
if(result){
list.add(s);
}
}
coll = list; //集合重置为list即保留下来的集合
return this;
}
}
package com.itheima10.source;
import java.util.ArrayList;
import java.util.Collections;
public class SourceDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张三","李四光","王五");
/*
* foreach:
* 1. 迭代器(底层)
* 2. t是集合中的每一个元素
* 执行次数 = 集合元素个数
*/
// new MyStream(list).forEach(t -> System.out.println(t));
/*
* MyStream filter(Predicate<String> predicate)
* predicate : boolean test(T t);
* 1. 迭代器
* 2. t 是集合中的每一个元素
* 3. 返回true : 表示保留这个元素
*/
new MyStream(list).filter(t -> t.length()==2).forEach(t-> System.out.println(t));
}
}
如下案例比较:
package com.itheima11.union;
import java.util.ArrayList;
import java.util.List;
public class Demo01 {
public static void main(String[] args) {
List<String> one = new ArrayList<>();
one.add("迪丽热巴");
one.add("宋远桥");
one.add("苏星河");
one.add("老子");
one.add("庄子");
one.add("孙子");
one.add("洪七公");
List<String> two = new ArrayList<>();
two.add("古力娜扎");
two.add("张无忌");
two.add("张三丰");
two.add("赵丽颖");
two.add("张二狗");
two.add("张天爱");
two.add("张三");
List<String> oneA = new ArrayList<>(); // 第一个队伍只要名字为3个字的成员姓名;
for (String name : one) {
if (name.length() == 3) {
oneA.add(name);
}
}
List<String> oneB = new ArrayList<>(); // 第一个队伍筛选之后只要前3个人;
for (int i = 0; i < 3; i++) {
oneB.add(oneA.get(i));
}
//11111111111111111111111111111111111111111111111111111111111111111111111111111111111111
List<String> twoA = new ArrayList<>(); // 第二个队伍只要姓张的成员姓名;
for (String name : two) {
if (name.startsWith("张")) {
twoA.add(name);
}
}
List<String> twoB = new ArrayList<>(); // 第二个队伍筛选之后不要前2个人;
for (int i = 2; i < twoA.size(); i++) {
twoB.add(twoA.get(i));
}
//11111111111111111111111111111111111111111111111111111111111111111111111111111111111111
List<String> totalNames = new ArrayList<>(); // 将两个队伍合并为一个队伍;
totalNames.addAll(oneB);
totalNames.addAll(twoB);
for (String name : totalNames) { // 打印整个队伍的姓名信息。
System.out.println(name);
}
}
}
package com.itheima11.union;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class Demo02 {
public static void main(String[] args) {
List<String> one = new ArrayList<>();
one.add("迪丽热巴");
one.add("宋远桥");
one.add("苏星河");
one.add("老子");
one.add("庄子");
one.add("孙子");
one.add("洪七公");
List<String> two = new ArrayList<>();
two.add("古力娜扎");
two.add("张无忌");
two.add("张三丰");
two.add("赵丽颖"以上是关于Java25Stream流:集合对象.stream()的主要内容,如果未能解决你的问题,请参考以下文章
获取单列集合,双列集合,数组的Stream流对象以及简单操作