当前位置: 代码迷 >> 综合 >> Java中的Stream流方式
  详细解决方案

Java中的Stream流方式

热度:88   发布时间:2024-02-09 17:10:17.0

一、基础案例

/*使用Stream流的方式,遍历集合,对集合中的数据进行过滤Stream流是JDK1.8之后出现的关注的是做什么,而不是怎么做*/
public class Demo01Stream {public static void main(String[] args) {//创建一个list集合,存储姓名List<String> list=new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");//对list集合中的元素进行过滤,只要以张开头的元素,存储到一个新的集合//对listA集合进行过滤,只要姓名长度为3的人,存储到一个新的集合中//遍历集合list.stream().filter(name->name.startsWith("张")).filter(name->name.length()==3).forEach(name-> System.out.println(name));}
}

二、获取到Stream流对象

/*java.util.stream.Stream<T>是java 8新加入的最常用的流接口。(这并不是一个函数式接口。)获取一个流非常简单,有以下几种方式:-所有的Collection集合都可以通过stream默认方法获取流;-Stream接口的静态方法of可以获取数组对应的流。static <T> Stream<T> of (T...values)*/
public class GetStream {public static void main(String[] args) {//把集合转换成Stream流List<String> list=new ArrayList<>();Stream<String> stream1=list.stream();Set<String> set=new HashSet<>();Stream<String> stream2=set.stream();Map<String,String> map=new HashMap<>();//获取键,存入到一个Set集合中Set<String> keySet=map.keySet();Stream<String> stream3=keySet.stream();//获取值,存储到一个Collection集合中Collection<String> values=map.values();Stream<String> stream4=values.stream();//获取键值对Set<Map.Entry<String,String>> entries=map.entrySet();Stream<Map.Entry<String,String>> stream5=entries.stream();//把数组转换成Stream流Stream<Integer> stream6=Stream.of(1,2,3,4,5);Integer[] arr={1,2,3,4,5};Stream<Integer> stream7=Stream.of(arr);}
}

三、Stream流常用方法

(1)forEach

/*Stream流中的常用方法_forEachvoid forEach(Consumer<? super T> action);该方法接受一个Consumer接口函数,会将每一个流元素交给该函数进行处理。Consumer接口是一个消费型的函数式接口,可以传递Lambda表达式,消费数据简单记:forEach方法,用来遍历流中的数据是一个终结方法,遍历后就不能继续调用Stream流中的其它方法*/
public class Demo02Stream_forEach {public static void main(String[] args) {//获取一个Stream流Stream<String> stream=Stream.of("张三","李四","王五","赵六","钱七");//使用Stream流中的方法forEach对Stream流的数据进行遍历stream.forEach(name-> System.out.println(name));}
}

(2)filter

/*Stream流中的常用方法_filter:用于对Stream流中的数据进行过滤Stream<T> filter(Predicate<? super T> predicate);filter方法的参数Predicate是一个函数式接口,所以可以传递Lambda表达式,对数据进行过滤boolean test(T t)*/
public class Demo03Stream_filter {public static void main(String[] args) {//创建一个Stream流Stream<String> stream=Stream.of("张三丰","张翠山","赵敏","周芷若","张无忌");stream.filter((name)->name.startsWith("张")).forEach((name)-> System.out.println(name));/*Stream流属于管道流,只能被消费(使用)一次第一个Stream流调用完毕方法,数据就会流转到下一个Stream上而这时第一个Stream流已经使用完毕,就会关闭了所以第一个Stream流就不能再调用方法了java.lang.IllegalStateException: stream has already been operated upon or closed*/stream.forEach((name)-> System.out.println(name));}
}

(3)map

/*如果需要将流中的元素映射到另一个流中,可以使用map方法。<R> Stream<R> map(Function<? super T,? extends R> mapper);该接口需要一个Function函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流。Function中的抽象方法:R apply(T t);*/
public class Demo04Stream_map {public static void main(String[] args) {//获取一个String 类型的Stream 流Stream<String> stream= Stream.of("1","2","3","4");//使用map方法,把字符串类型的整数,转换(映射)为Integer类型的证书Stream<Integer> stream2=stream.map(s->Integer.parseInt(s));//遍历stream2.forEach(i-> System.out.println(i));}
}

(4)count

/*Stream流中的常用方法_count:用于统计Stream流中元素的个数long count();count方法是一个终结方法,返回值是一个long类型的整数所以不能 再继续调用Stream流中的其他方法了*/
public class Demo05Stream_count {public static void main(String[] args) {//获取一个Stream流ArrayList<Integer> list=new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);System.out.println(list.stream().count());}
}

(5)limit

/*Stream流中的常用方法_limit:用于截取流中的元素limit方法中可以对流进行截取,只取用前n个,方法签名:Stream<T> limit(long maxSize);参数是一个long型,如果集合当前长度大于参数则进行截取,否则不进行操作limit方法是一个延迟方法,只是对流中的元素进行截取,返回的是一个新的流,所以可以继续调用Stream流中的其他方法*/
public class Demo06Stream_limit {public static void main(String[] args) {String[] arr={"美羊羊","喜洋洋","灰太狼","红太狼","懒洋洋"};Stream<String> stream=Stream.of(arr);stream.limit(3).forEach(name-> System.out.println(name));}
}

(6)skip

/*Stream流中的常用方法_skip:用于跳过元素如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流Stream<T> skip(long n)如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流。*/
public class Demo07Stream_skip {public static void main(String[] args) {String[] arr={"美羊羊","喜洋洋","灰太狼","红太狼","懒洋洋"};Stream<String> stream=Stream.of(arr);stream.skip(1).limit(3).forEach(name-> System.out.println(name));}
}

(7)concat

/*Stream流中的常用方法_concat:用于把流组合到一起如果有两个流,希望合并成为一个流,那么可以使用Stream接口的静态方法concatstatic <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)*/
public class Demo08Stream_concat {public static void main(String[] args) {Stream<String> stream1= Stream.of("张三丰","张翠山");Stream<String> stream2= Stream.of(new String[]{"美洋洋","喜羊羊"});Stream<String> concat=Stream.concat(stream1,stream2);concat.forEach(name-> System.out.println(name));}
}