Java8利用stream对集合的复杂操作(顺序处理,并行处理)

又是一个很平常的周六,习惯性地来到公司,中午看了会Java8实战,发现其中讲到Stream实现集合的复杂操作,于是自己动手写了个Demo,并测试了下效率。

结果是并行处理的效率远远高于顺序处理。可能与我在公司用的电脑有关(我用的是8核)。

话不多说,直接放代码:

package xie.test.stream;


import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


public class StreamTest {

private static List<Player> players = new ArrayList<>();

static void initPlayers(){
Player player1 = new Player("Jerry", 1, 250.0);
Player player2 = new Player("Lucy", 0, 365.0);
Player player3 = new Player("Herry", 0, 222.0);
Player player4 = new Player("Jack", 1, 11.0);
Player player5 = new Player("Ham", 1, 2.0);
Player player6 = new Player("Dem", 1, 21.0);
Player player7 = new Player("Roce", 0, 122.0);
Player player8 = new Player("Back", 1, 182.0);
players.add(player1);
players.add(player2);
players.add(player3);
players.add(player4);
players.add(player5);
players.add(player6);
players.add(player7);
players.add(player8);
}

/**
* 利用parallelStream筛选余额大于20的玩家,并根据性别进行分组(并行处理)
* @param players
* @return
*/
static Map<Integer,List<Player>> parallelStreamSort(List<Player> players){
return players.parallelStream().filter((Player p) -> p.getMoney() > 20).collect(Collectors.groupingBy(Player::getSex));
}
/**
* 利用stream筛选余额大于20的玩家,并根据性别进行分组(顺序处理)
* @param players
* @return
*/
static Map<Integer,List<Player>> streamSort(List<Player> players){
return players.stream().filter((Player p) -> p.getMoney() > 20).collect(Collectors.groupingBy(Player::getSex));
}

public static void main(String[] args) {
initPlayers();

long time = System.currentTimeMillis();
System.out.println(streamSort(players));
System.out.println("顺序处理时间:"+(System.currentTimeMillis() - time));

long time1 = System.currentTimeMillis();
System.out.println(parallelStreamSort(players));
System.out.println("并行处理时间:"+(System.currentTimeMillis() - time1));
}
}

 

该用例中,集合中只有8个元素,但通过多次运行结果显示,并行处理时间多次能达到0,少数为16毫秒,即秒过,而顺序处理的时间稳定在63毫秒左右。

按理想状态来说,并行处理效率应为顺序处理的8倍(前面提到我的电脑为8核CPU),即运行时间的1/8,但由于数据量少的原因,无法测出稳定性,于是,我把数据量增加到1000W,继续测试。

此时发现结果出现了惊天大逆转,顺序处理的效率远远超过了并行处理,大概为其五倍左右。

为什么会出现这种情况呢,我也很郁闷,我也是个新手啊,哥哥。然后我发现我的案例中是单线程的环境,诶,好像发现问题了。parallelStream是并行处理,在多线程的环境下可能会更好,但也只是猜想。

希望各位大佬看到这种问题能把正确的使用方式告诉我下呢!

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Java 8的流(stream操作是一种新的API,提供了一种简单而有效的方法来处理集合和数组等数据类型。流操作可以让我们以一种更加声明式的方式来处理数据,从而提高代码的可读性和可维护性。 Java 8的流操作具有以下特点: 1. 集成了过滤、映射、排序、聚合等操作; 2. 支持并行处理,提高了运行效率; 3. 可以避免空指针异常等常见问题; 4. 支持延迟计算,节省了资源。 下面是使用Java 8的流操作的一些示例: 1. 过滤操作: ``` List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> result = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); ``` 上面的代码使用了stream()方法将List转换成流,使用filter()方法过滤出偶数,最后使用collect()方法将结果转换成List。 2. 映射操作: ``` List<String> words = Arrays.asList("hello", "world"); List<Integer> result = words.stream() .map(String::length) .collect(Collectors.toList()); ``` 上面的代码使用了map()方法将List的字符串转换成它们的长度,最后使用collect()方法将结果转换成List。 3. 排序操作: ``` List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2); List<Integer> result = numbers.stream() .sorted() .collect(Collectors.toList()); ``` 上面的代码使用了sorted()方法将List的数字按升序排序,最后使用collect()方法将结果转换成List。 4. 聚合操作: ``` List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Optional<Integer> result = numbers.stream() .reduce((a, b) -> a + b); ``` 上面的代码使用了reduce()方法将List的数字相加,最后返回一个Optional对象,其值为15。 在实际开发Java 8的流操作可以大大简化代码,提高开发效率。但是需要注意的是,在处理大量数据时,流操作可能会对性能产生影响,因此需要根据实际情况选择合适的方法。 ### 回答2: Java 8引入了流(stream操作,它是一种用于处理集合数据的新方式。 流操作主要通过对集合进行一系列的处理操作来实现数据的筛选、转换、聚合等功能。与传统的集合操作相比,流操作具有更加简洁、灵活和高效的特点。下面是一些常用的流操作: 1. 过滤(filter):根据指定条件从流筛选出符合条件的元素。 2. 映射(map):通过对流的每个元素应用指定的函数来生成一个新的流,可以对元素进行转换或提取。 3. 排序(sorted):对流的元素进行排序,可以根据自然顺序或自定义的排序规则进行排序。 4. 限制(limit):截断流,获取指定数量的元素。 5. 跳过(skip):跳过指定数量的元素。 6. 匹配(matching):用于检查流的元素是否满足指定的条件。 7. 查找(finding):在流查找符合指定条件的元素。 8. 聚合(reducing):将流的元素使用指定的操作进行聚合,可以得到最大值、最小值、求和等结果。 9. 收集(collecting):将流的元素收集到一个集合,可以使用预定义的收集器或自定义的收集器。 使用流操作可以大大简化代码,并且使得操作更为直观和易于理解。它提供了丰富的功能,可以处理各种不同类型的集合数据。同时,流操作的使用还可以减少间变量的使用,提高代码的性能。 综上所述,Java 8的流操作是一种强大的工具,可以帮助我们对集合数据进行高效的处理,提升代码的简洁性和可读性。它是现代化Java编程不可或缺的一部分。 ### 回答3: Java 8 引入了流(stream操作,它是一种新的处理数据集合的方式。流操作可以让我们以更简洁、清晰和灵活的方式处理数据。 首先,流是一组有序的元素,它可以来自各种数据源,比如数组、集合或者I/O通道。流操作分为两种类型:操作和终端操作操作可以对流进行转换或者过滤,但并不产生最终结果。而终端操作会触发流的处理,并产生一个结果或副作用。 通过流操作,我们可以进行各种常见的数据处理操作。例如,我们可以使用 filter 方法来过滤流的元素,只保留符合条件的元素。可以使用 map 方法来对流的元素进行映射,生成一个新的流。可以使用 reduce 方法将流的所有元素聚合起来并生成一个结果。 此外,流操作还支持并行处理。通过将流转换为并行流,我们可以同时对多个元素进行处理,提高处理效率。但是需要注意的是,并不是所有的流操作都适合并行处理,有些操作并行处理时可能会导致结果不确定或出错。 总之,Java 8 的流操作可以让我们以更简洁、灵活的方式处理数据集合。它提供了丰富的操作和终端操作,支持串行和并行处理。通过学习和掌握流操作,我们可以更高效地处理数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值