对集合元素进行处理:传统方式和Stream方式的对比
Posted liyihua
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对集合元素进行处理:传统方式和Stream方式的对比相关的知识,希望对你有一定的参考价值。
题目
现在有两个 ArrayList 集合存储队伍当中的多个成员姓名,要求使用传统的for循环(或增强for循环)依次进行以下若干操作步骤:
- 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中。
- 第一个队伍筛选之后只要前3个人;存储到一个新集合中。
- 第二个队伍只要姓张的成员姓名;存储到一个新集合中。
- 第二个队伍筛选之后不要前2个人;存储到一个新集合中。
- 将两个队伍合并为一个队伍;存储到一个新集合中。
- 根据姓名创建 Person 对象;存储到一个新集合中。
- 打印整个队伍的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 接口中的常用方法。
以上是关于对集合元素进行处理:传统方式和Stream方式的对比的主要内容,如果未能解决你的问题,请参考以下文章