Stream流(stream流去重)

  本篇文章为你整理了Stream流(stream流去重)的详细内容,包含有stream流过滤list stream流去重 stream流分组 stream流用法 Stream流,希望能帮助你了解 Stream流。

  

public class Demo {

 

   public static void main(String[] args) {

   //创建集合,存储多个字符串元素

   ArrayList String list = new ArrayList ();

   list.add("张三丰");

   list.add("李白");

   list.add("王二");

   list.add("张译");

   list.add("马文才");

   list.add("张怀民");

   //创建新集合,以存储“张”开头的元素

   ArrayList String zhang = new ArrayList ();

   for (String s : list) {

   if (s.startsWith("张")){

   zhang.add(s);

   //创建新集合,以存储“张”开头的长度为3的元素

   ArrayList String zhangSan = new ArrayList ();

   for (String s : zhang) {

   if (s.length()==3){

   zhangSan.add(s);

   //遍历集合

   for (String s : zhangSan) {

   System.out.println(s);

  

 

  运行结果:

  

张三丰

 

  

 

  不难看出,代码过长且重复度过高;通过Stream流改进

  

public class Demo {

 

   public static void main(String[] args) {

   //创建集合,存储多个字符串元素

   ArrayList String list = new ArrayList ();

   list.add("张三丰");

   list.add("李白");

   list.add("王二");

   list.add("张译");

   list.add("马文才");

   list.add("张怀民");

   //使用Stream和方法引用改进

   list.stream().filter(s - s.startsWith("张")).filter(s - s.length() == 3).forEach(System.out::println);

  

 

  运行结果:

  

张三丰

 

  

 

  Stream流的生成方式

  Stream流的使用

  
Stream流的常见生成方式

  

public class Demo1 {

 

   public static void main(String[] args) {

   //Collection体系的集合,使用默认方法stream()生成流

   ArrayList String list = new ArrayList ();

   Stream String listStream = list.stream();

   HashSet String set = new HashSet ();

   Stream String setStream = set.stream();

   //Map体系集合,间接生成流

   HashMap String, String map = new HashMap ();

   //键的流

   Stream String keyStream = map.keySet().stream();

   //值的流

   Stream String valueStream = map.values().stream();

   //键值对对象的流

   Stream Map.Entry String, String entryStream = map.entrySet().stream();

   //数组通过Stream接口的静态方法of(T... values)生成流

   String[] strArr = {"hello","world","java"};

   //of中的参数可变

   Stream String strArrStream = Stream.of(strArr);

   Stream String strArrStream1 = Stream.of("hello","world","java");

   Stream Integer strArrStream2 = Stream.of(10,20,33);

  

 

  Stream流中间操作

  
以Stream开头的语句,做了终结操作之后,就不能再次开始;否则会报错。

  以数据源开始转为stream流的语句,做了终结操作之后,还可以再次以数据源开始做操作

  
 

  filter

  

public class Demo {

 

   public static void main(String[] args) {

   ArrayList String list = new ArrayList ();

   list.add("张三丰");

   list.add("李白");

   list.add("王二");

   list.add("张译");

   list.add("马文才");

   list.add("张怀民");

   //输出“张”开头的元素

   list.stream().filter(s - s.startsWith("张")).forEach(System.out::println);

   System.out.println("----------------");

   //输出长度为3的元素

   list.stream().filter(s - s.length() == 3).forEach(System.out::println);

   System.out.println("----------------");

   //输出“张”开头,并且长度为3的元素

   list.stream().filter(s - s.startsWith("张")).filter(s - s.length() == 3).forEach(System.out::println);

  

 

  运行结果:

  

张三丰

 

  ----------------

  ----------------

  

 

  limit skip

  
 

  

public class Demo {

 

   public static void main(String[] args) {

   ArrayList String list = new ArrayList ();

   list.add("张三丰");

   list.add("李白");

   list.add("王二");

   list.add("张译");

   list.add("马文才");

   list.add("张怀民");

   //输出前3个元素

   list.stream().limit(3).forEach(System.out::println);

   System.out.println("-------------");

   //输出除了前3个元素以外的元素

   list.stream().skip(3).forEach(System.out::println);

   System.out.println("-------------");

   //跳过前2个元素,输出接下来的2个元素

   list.stream().skip(2).limit(2).forEach(System.out::println);

  

 

  运行结果:

  

张三丰

 

  -------------

  -------------

  

 

  concat distinct

  

public class Demo2 {

 

   public static void main(String[] args) {

   ArrayList String list = new ArrayList ();

   list.add("张三丰");

   list.add("李白");

   list.add("王二");

   list.add("张译");

   list.add("马文才");

   list.add("张怀民");

   //需求1:获取前4个元素,组成一个流

   Stream String s1 = list.stream().limit(4);

   //需求2:跳过2个元素,组成一个流

   Stream String s2 = list.stream().skip(2);

   //需求3:合并需求1和需求2的流,输出

   //Stream.concat(s1,s2).forEach(System.out::println);

   //需求4:合并需求1和需求2的流,输出,要求字符串元素不能重复

   Stream.concat(s1,s2).distinct().forEach(System.out::println);

  

 

  运行结果:

  

张三丰

 

  

 

  sorted

  

public class Demo3 {

 

   public static void main(String[] args) {

   ArrayList String list = new ArrayList ();

   list.add("libai");

   list.add("yangyuhuan");

   list.add("wuzetian");

   list.add("zhaohuaizhen");

   list.add("sikongzhen");

   list.add("shangguanwaner");

   //需求1:按照字母顺序输出数据

   list.stream().sorted().forEach(System.out::println);

   System.out.println("------------");

   //需求2:按照字符串长度输出数据

   list.stream().sorted((s1, s2) - s1.length() - s2.length()).forEach(System.out::println);

   System.out.println("------------");

   //需求3:按照字符串长度输出数据,长度相同时自然排序

   list.stream().sorted((s1, s2) - {

   int num = s1.length() - s2.length();

   int num2 = num == 0 ? s1.compareTo(s2) : num;

   return num2;

   }).forEach(System.out::println);

  

 

  运行结果:

  

libai

 

  shangguanwaner

  sikongzhen

  wuzetian

  yangyuhuan

  zhaohuaizhen

  ------------

  libai

  wuzetian

  yangyuhuan

  sikongzhen

  zhaohuaizhen

  shangguanwaner

  ------------

  libai

  wuzetian

  sikongzhen

  yangyuhuan

  zhaohuaizhen

  shangguanwaner

  

 

  map mapToInt

  Stream流调用了mapToInt()方法,就会变成IntStream流
 

  IntStream流可以调用sum()方法

  

public class Demo4 {

 

   public static void main(String[] args) {

   ArrayList String list = new ArrayList ();

   list.add("10");

   list.add("20");

   list.add("30");

   list.add("40");

   list.add("50");

   //需求:使用map()将集合中的字符串转为整数后输出

   list.stream().map(s - Integer.parseInt(s)).forEach(System.out::println);

   System.out.println("-----------");

   //方法引用

   list.stream().map(Integer::parseInt).forEach(System.out::println);

   System.out.println("-----------");

   //需求2:使用mapToInt()将集合中的字符串转为整数后输出

   list.stream().mapToInt(Integer::parseInt).forEach(System.out::println);

   System.out.println("-----------");

   //需求3:使用IntStream()中的sum(),返回int元素的总和,输出结果

   System.out.println(list.stream().mapToInt(Integer::parseInt).sum());

  

 

  运行结果:

  

10

 

  -----------

  -----------

  -----------

  

 

  Stream流常见的终结操作方法

  forEach count

  

public class Demo5 {

 

   public static void main(String[] args) {

   ArrayList String list = new ArrayList ();

   list.add("张三丰");

   list.add("李白");

   list.add("王二");

   list.add("张译");

   list.add("马文才");

   list.add("张怀民");

   //需求1:输出集合中的元素

   list.stream().forEach(System.out::println);

   //需求1:统计以“张”开头的元素,输出统计结果

   System.out.println(list.stream().filter(s - s.startsWith("张")).count());

  

 

  运行结果:

  

张三丰

 

  

 

  
 

  

public class Demo6 {

 

   public static void main(String[] args) {

   ArrayList String list1 = new ArrayList ();

   list1.add("马保国");

   list1.add("陈龙");

   list1.add("张丰毅");

   list1.add("胡歌");

   list1.add("李永健");

   list1.add("赵本山");

   ArrayList String list2 = new ArrayList ();

   list2.add("林黛玉");

   list2.add("刘亦菲");

   list2.add("陶虹");

   list2.add("宋佳");

   list2.add("林心如");

   list2.add("张嘉倪");

   //男演员只要名字为三个字的前3人

   Stream String man = list1.stream().filter(s - s.length() == 3).limit(3);

   //女演员只要姓林的,并且不要第一个

   Stream String women = list2.stream().filter(s - s.startsWith("林")).skip(1);

   //把man和women合并在一起

   Stream String concat = Stream.concat(man, women);

   //将concat中的元素作为构造方法的参数,创建对象,遍历数据

   concat.map(Actor::new).forEach(s- System.out.println(s.getName()));

  

 

  运行结果:

  

马保国

 

  

 

  将流中的数据存入集合

  

public class Demo6 {

 

   public static void main(String[] args) {

   ArrayList String arrayList = new ArrayList ();

   arrayList.add("马保国");

   arrayList.add("陈龙");

   arrayList.add("张丰毅");

   arrayList.add("胡歌");

   arrayList.add("李永健");

   arrayList.add("张择端");

   //需求1:以流的方式拿到以“张”开头的元素,

   Stream String strStream = arrayList.stream().filter(s - s.startsWith("张"));

   //需求2:将流收集到list集合,并遍历集合

   List String list = strStream.collect(Collectors.toList());

   for (String s : list) {

   System.out.println(s);

   System.out.println("------");

   HashSet Integer hashSetset = new HashSet ();

   hashSetset.add(10);

   hashSetset.add(20);

   hashSetset.add(30);

   hashSetset.add(33);

   hashSetset.add(35);

   //需求3:获取大于25的元素

   Stream Integer setStream = hashSetset.stream().filter(s - s 25);

   //需求4:将流收集到set集合,并遍历

   Set Integer set = setStream.collect(Collectors.toSet());

   for (Integer i : set) {

   System.out.println(i);

  

 

  运行结果:

  

张丰毅

 

  ------

  

 

  

public class Demo6 {

 

   public static void main(String[] args) {

   String[] str = {"张艺兴,11","刘强东,29","朱之文,33","高启强,28"};

   //需求1:获取年龄大于28的元素

   Stream String stringStream = Stream.of(str).filter(s - Integer.parseInt(s.split(",")[1]) 28);

   //需求2:把流存入Map集合,并遍历

   Map String, Integer map = stringStream.collect(Collectors.toMap(s - s.split(",")[0],

   s - Integer.parseInt(s.split(",")[1])));

   for (Map.Entry String, Integer entry : map.entrySet()) {

   System.out.println(entry.getKey() + "-" + entry.getValue());

  

 

  运行结果:

  

朱之文-33

 

  刘强东-29

  

 

  以上就是Stream流(stream流去重)的详细内容,想要了解更多 Stream流的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: