集合元素处理

  • 传统方式
    • 题目
    • 解答
  • Stream 方式
    • 题目
    • 解答

传统方式

题目

现在有两个 ArrayList 集合存储队伍当中的多个成员姓名. 要求使用传统的 for 循环 (或增强 for 循环) 依次进行以下若干操作步骤:

  1. 第一个队伍只要名字为 3 个字的成员姓名, 存储到一个新集合中
  2. 第一个队伍筛选之后只要前 3 个人, 存储到一个新集合中
  3. 第二个队伍只要姓张的成员姓名, 存储到一个新结合中
  4. 第二个队伍筛选之后不要前 2 个人, 存储到一个新集合中
  5. 将两个队伍合并为一个队伍, 存储到一个新集合中
  6. 根据姓名创建 Person 对象, 存储到一个新集合中
  7. 打印整个队伍的 Person 对象信息

两个队伍 (集合) 的代码如下:

import java.util.ArrayList;public class Test {public static void main(String[] args) {// 第一支队伍ArrayList<String> one = new ArrayList<>();one.add("迪丽热巴");one.add("宋远桥");one.add("苏星河");one.add("石破天");one.add("石中玉");one.add("老子");one.add("庄子");one.add("洪七公");// 第二支队伍ArrayList<String> two = new ArrayList<>();two.add("古力娜扎");two.add("张无忌");two.add("赵丽颖");two.add("张三丰");two.add("尼古拉斯赵四");two.add("张天爱");two.add("张二狗");// ....}
}

而 Person 类的代码为:

public class Person {private String name;public Person(String name){this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +'}';}
}

解答

既然使用传统的 for 循环写法, 那么:

import 前120.Person;import java.util.ArrayList;
import java.util.List;public class Test126 {public static void main(String[] args) {// 第一支队伍ArrayList<String> one = new ArrayList<>();one.add("迪丽热巴");one.add("宋远桥");one.add("苏星河");one.add("石破天");one.add("石中玉");one.add("老子");one.add("庄子");one.add("洪七公");// 第二支队伍ArrayList<String> two = new ArrayList<>();two.add("古力娜扎");two.add("张无忌");two.add("赵丽颖");two.add("张三丰");two.add("尼古拉斯赵四");two.add("张天爱");two.add("张二狗");// 第一支队伍要名字为3个字的成员姓名List<String> oneA = new ArrayList<>();for (String name : one) {if (name.length() == 3) {oneA.add(name);}}// 第一个队伍筛选之后只要前3个人List<String> oneB = new ArrayList<>();for (int i = 0; i < 3; i++) {oneB.add(oneA.get(i));}// 第二个队伍只要姓张的成员姓名List<String> twoA = new ArrayList<>();for (String name : two) {if (name.startsWith("张")) {twoA.add(name);}}// 第二个队伍筛选之后不要前2个人List<String> twoB = new ArrayList<>();for (int i = 2; i < twoA.size(); i++) {twoB.add(twoA.get(i));}// 将两个队伍合并为一个队伍List<String> totalNames = new ArrayList<>();totalNames.addAll(oneB);totalNames.addAll(twoB);// 根据姓名创建Person对象List<Person> totalPersonList = new ArrayList<>();for (String name : totalNames) {totalPersonList.add(new Person(name));}}
}

输出结果:

Person{name='宋远桥'}
Person{name='苏星河'}
Person{name='石破天'}
Person{name='张天爱'}
Person{name='张二狗'}

Stream 方式

题目

将上一题当中的传统 for 循环写法更换为 Stream 流处理方式. 两个集合的初始内容不变, Person 类的定义也不变.

解答

等效的 Stream 流式处理代码为:

import java.util.ArrayList;
import java.util.stream.Stream;public class Test127 {public static void main(String[] args) {// 第一支队伍ArrayList<String> one = new ArrayList<>();one.add("迪丽热巴");one.add("宋远桥");one.add("苏星河");one.add("石破天");one.add("石中玉");one.add("老子");one.add("庄子");one.add("洪七公");// 第二支队伍ArrayList<String> two = new ArrayList<>();two.add("古力娜扎");two.add("张无忌");two.add("赵丽颖");two.add("张三丰");two.add("尼古拉斯赵四");two.add("张天爱");two.add("张二狗");// 第一支队伍要名字为3个字的成员姓名, 第一个队伍筛选之后只要前3个人Stream<String> streamOne = one.stream().filter(s -> s.length() == 3).limit(3);// 第二个队伍只要姓张的成员姓名, 第二个队伍筛选之后不要前2个人Stream<String> streamTwo = two.stream().filter(s -> s.startsWith("张")).skip(2);// 将两个队伍合并为一个队伍, 根据姓名创建Person对象Stream<Person> totalNames = Stream.concat(streamOne, streamTwo).map(Person::new);totalNames.forEach(System.out::println);}
}

运行效果完全一样:

Person{name='宋远桥'}
Person{name='苏星河'}
Person{name='石破天'}
Person{name='张天爱'}
Person{name='张二狗'}

Java基础 第五节 第八课相关推荐

  1. Java基础 第五节 第七课

    Stream 流 概述 传统集合的多步遍历代码 循环遍历的弊端 Stream 的更优写法 流式思想概述 步骤方案 元素队列 获取流 根据 Collection 获取流 根据 Map 获取流 根据数组获 ...

  2. Java基础 第五节 第九课

    方法引用 概述 冗余的 Lambda 场景 用方法改进代码 问题分析 代码展示 方法引用符 语义分析 推导与省略 通过对象名成员方法 通过类名称引用静态方法 通过 super 引用成员方法 通过 th ...

  3. Java实习生常规技术面试题每日十题Java基础(五)

    目录 1.启动一个线程是用run()还是start()? . 2.线程的基本状态以及状态之间的关系. 3.Set和List的区别,List和Map的区别? 4.同步方法.同步代码块区别? 5.描述Ja ...

  4. java基础学习 --- 第二节 变量、数据类型和运算符

    java基础学习 - 第二节 变量.数据类型和运算符 一.变量 1.变量就是会发生改变的数据,程序运行时,这些数据以变量的形式被保存到计算机的内存中.如图 2.使用变量的步骤:     声明变量 - ...

  5. Java校招笔试题-Java基础部分(五)

    导语   Java 面试题集2021版 Java基础部分五 47.String 和String Buffer的区别 48.StringBuffer和StringBuilder的区别 49.数组有没有l ...

  6. 初等数学O 集合论基础 第五节 群、环、域的概念

    初等数学O 集合论基础 第五节 群.环.域的概念 在第四讲中,我们在一般集合上定义了运算,这一讲的目标是为这些运算建立运算法则,一些具有特定运算与运算法则的集合具有良好的性质,值得我们专门对它命名,并 ...

  7. Linux 探索之旅 | 第五部分第八课:用 Shell 做统计练习

    -- 作者 谢恩铭 转载请注明出处 <Linux探索之旅>全系列 内容简介 前言 成果展示 解题步骤和答案 可能的优化 第五部分第九课预告 1. 前言 上一课 Linux探索之旅 | 第五 ...

  8. Java基础系列五 面向对象程序设计

    Java基础系列第一章 初识Java语言 Java基础系列第二章 Java语言基础 Java基础系列第三章 Java流程控制 Java基础系列第四章 Java数组与字符串 Java基础系列第五章 面向 ...

  9. Java基础知识(五) 字符串与数组

    Java基础知识 字符串与数组 1. 字符串的创建与存储的机制是什么 2. "==".equals和hashCode有什么区别 3. String.StringBuffer.Str ...

最新文章

  1. 第二阶段第八次spring会议
  2. 理清fineuploader无刷新上传的一些事
  3. redis事务不具有回滚机制,那么它是如何进行事务控制的
  4. .NET软件开发, 你应该知道 (整)
  5. jmeter学习笔记(十三)debug调试工具
  6. python学习day06--01
  7. 自省的力量-我看《走出软件作坊》
  8. Oracle goldengate通用配置
  9. java 算法 福尔摩斯的约会
  10. Prompt | 从CLIP到CoOp,Visual-Language Model新范式
  11. 获取iframe子页面节点,响应浏览器宽高
  12. 容器技术Docker K8s 9 容器服务ACK应用场景
  13. MacBook安装p7zip解压7z文件
  14. String fname=%e6%8e%88%e6%9d%832; url转码成中文
  15. Google-admob广告变现
  16. 中国北斗简单原理随笔
  17. 什么是CUDA与CUDNN
  18. 按防电击类型分类的II设备(无保护接地线缆)可免于线对地的浪涌实验
  19. 这,这,是个神人,我喜欢
  20. 【AIX】LPar分区技术、逻辑CPU、虚拟CPU、物理CPU

热门文章

  1. 利用WebUploader实现大文件上传和视频上传
  2. 苹果手机充电口接触不良怎么办_成都iPhone手机充电口接触不良怎么办
  3. 虚火之下的直播,盈利真的只是一场美梦?
  4. 因高额网络费用,Arbitrum 奥德赛活动暂停,Nitro 发行迫在眉睫
  5. Vue 个别手机或者 IOS8.2浏览器打不开,显示空白的解决方案
  6. 苹果Siri智能语音被逆袭,且看“新秀”华为平板M5青春版
  7. 一年40万次实验,字节跳动A/B测试平台是怎么炼出来的?
  8. CentOS下主DNS、辅助DNS以及子域DNS的配置
  9. Gitee 上最不明觉厉的项目:用代码创造出一个人工生命
  10. EXCEL--:将多个单元格中的内容合并到一个单元格中