文档章节

用Java8解决数据中的简单问题

R
 Refresh-LV
发布于 2017/07/25 11:24
字数 103
阅读 15
收藏 0

@Test
    public void testSquare() {
        List<Integer> list = Arrays.asList(1,3,5,7,9,11);
        List<Integer> list1 = Arrays.asList(1,3,5,7,9,11);
        List<Integer> newList = list.stream().map(l ->l*l).collect(Collectors.toList());
        System.out.println(newList);
        List<int[]> lists = list.stream()
                .flatMap(i ->list1.stream()
                                                        .filter(j -> (i+j)%3==0)
                                                         .map(j -> new int[]{i,j})
                        )
                .collect(Collectors.toList());
        List<String> list2 = new ArrayList<>();
        lists.stream().forEach(l ->{
                    System.out.print(Arrays.toString(l));
                    list2.add(Arrays.toString(l));
                                    });
        System.out.println();
        System.out.println(list2);
    }

用Java8的stream解决实际操作中的数据转换,比循环遍历方便多了

© 著作权归作者所有

R
粉丝 1
博文 23
码字总数 7973
作品 0
仙桃
私信 提问
加载中

评论(2)

R
Refresh-LV 博主

引用来自“dipengfei”的评论

您的最后一个foreach是有副作用(side-effects)的,换句话说,不能在一个stream操作中改变另一个对象的状态,在您您最后的一个foreach中,list2对于当前stream来讲就是被改变状态的对象。虽然大多数情况下,code是能正常work的,但存在隐患,例如线程安全问题。我们都知道ArralyList不是线程安全的,如果把lists.stream()改成lists. parallelStream(),那么list2.add()就会被多线程访问,是不安全的。
所以最后一个foreach的写法,要看目的,如果只为了输出,应该这样写
lists.stream().map(Arrays::toString).forEach(System.out::println);
如果想要收集为新的List并输出,应该分两步写,这样不会有副作用
List<String> list2 = lists.stream().map(Arrays::toString).collect(Collectors.toList());
然后直接在list2上forEach
list2.forEach(System.out::println);

谢谢大神的指导,实习小菜鸟不懂的太多了,还需多多学习
dipengfei
dipengfei
您的最后一个foreach是有副作用(side-effects)的,换句话说,不能在一个stream操作中改变另一个对象的状态,在您您最后的一个foreach中,list2对于当前stream来讲就是被改变状态的对象。虽然大多数情况下,code是能正常work的,但存在隐患,例如线程安全问题。我们都知道ArralyList不是线程安全的,如果把lists.stream()改成lists. parallelStream(),那么list2.add()就会被多线程访问,是不安全的。
所以最后一个foreach的写法,要看目的,如果只为了输出,应该这样写
lists.stream().map(Arrays::toString).forEach(System.out::println);
如果想要收集为新的List并输出,应该分两步写,这样不会有副作用
List<String> list2 = lists.stream().map(Arrays::toString).collect(Collectors.toList());
然后直接在list2上forEach
list2.forEach(System.out::println);

Java8解决了什么?

在学习面向对象时,许多人都会用Java来举例子,但是其实Java并非纯正的面向对象语言,最明显的就是:int,double等基本类型不是对象。 自从java8出来过后,引入了流,函数式编程,就更不是在向...

MageekChiu
2017/08/02
0
0
跟上Java8 - Stream API快速入门

跟上Java8 - Stream API快速入门 王爵的技术博客2017-07-1821 阅读 streamfilterJava8 在前面我们简单介绍了 表达式,Java8旨在帮助程序员写出更好的代码, 其对核心类库的改进也是关键的一部...

王爵的技术博客
2017/07/18
0
0
Java8之Stream流(终篇)流与迭代器

在本系列文章发布的时候,有很多同学反映,Stream流的调试和forEach()的调试都不是特别友好,那本篇给出一个折中的调试方法,虽然不能完美解决调试的问题,但是基本上能解决绝大部分的调试问...

揭光智
2018/07/25
0
0
把 Java 8 流解析成 SQL

当我们尝试用“Java 8 的方式”使用数据库时,如何去解决性能上的问题呢? 通过与 ZeroTurnaround 合作,我们为你带来了 Java Zone。你可以阅读这里的 8 个步骤的指南,来看看如何在编写代码...

oschina
2015/12/28
7.7K
35
java8的ParallelStream踩坑记录

java8中的新特性stream流处理,让集合操作变得非常的简单,但是因为没有源码支持,所以里面有很多坑,只有踩过才知道 首先上代码 代码很简单,就是利用并行流把一个list里面的数据导入到另外...

格子衫码农
2018/08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
今天
8
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
6
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
8
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
5
0
rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部