对集合元素进行处理:传统方式和Stream方式的对比

题目

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

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

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

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

Person 类的代码为:

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

传统方式解答

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

复制
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class DemoArrayListNamesTradition {
public static void main(String[] args) {
//第一支队伍
ArrayList<String> one = new ArrayList<>();
Collections.addAll(one, "迪丽热巴", "宋远桥", "苏星河", "石破天", "石中玉", "老子", "庄子", "洪七公");
//第二支队伍
ArrayList<String> two = new ArrayList<>();
Collections.addAll(two, "古力娜扎", "张无忌", "赵丽颖", "张三丰", "尼古拉斯赵四", "张天爱", "张二狗");
// 第一个队伍只要名字为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对象信息。
for (Person person : totalPersonList) {
System.out.println(person);
}
}
}

运行程序,控制台输出:

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

Stream方式解答

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

运行程序,控制台输出:

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

该程序中,使用的Stream接口中的方法:java.util.stream.Stream 接口中的常用方法

posted @   LeeHua  阅读(1136)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示