这可能是项目中最实用的java8示例了,还不来看?
一、组成及特点
- 数据源、中间操作、终端操作
- 流只能使用一次
- 并行流 和 串行流
二、可以产生流的数据源 - 集合、文件
三、中间操作 - 字符串操作拼接joining(""),底层实现是StringBuilder.append();
//例1
private static String appendStr(){
List<String> stringList = Arrays.asList("h","e","l","l","o");
String str = stringList.stream().collect(Collectors.joining("-"));
//结果: h-e-l-l-o
return str;
}
//例2
public class ShangPin {
private String id;
private String mc;
//getter ..,setter
public static void main(String[] args) {
List<ShangPin> list = new ArrayList<>();
for (int i = 0; i < 5 ; i++) {
ShangPin shangPin = new ShangPin();
shangPin.setId(i+"");
shangPin.setMc("名称"+i);
list.add(shangPin);
}
//名称逗号分割
String mcs = list.stream().map( shangPin -> shangPin.getMc()).collect(Collectors.joining(","));
System.out.println(mcs);
}
}
- for循环
public static void test17(){
List<String> list = Arrays.asList("j","a","k","l");
list.forEach(x->{
System.out.println(x);
});
}
- 筛选
@Test
public void test7(){
List<String> stringList = new ArrayList<>();
JSONArray jsonArray = new JSONArray();
//数据源
for (int i = 0; i < 4; i++) {
stringList.add(i+"");
JSONObject jsonObject = new JSONObject();
jsonObject.put("num",i+"");
jsonArray.add(jsonObject);
}
//中间-筛选
Stream<String> stream = stringList.stream().filter(x -> "1".equals(x) || "3".equals(x));
Stream<JSONObject> _stream = jsonArray.stream().filter( o ->{
String num = ((JSONObject)o).getString("num");
return "1".equals(num) || "3".equals(num);
} );
//终端-收集 单个(类似 for循环里break )/集合
//String str = stream.findFirst().get();
//JSONObject json = _stream.findFirst().get();
List<String> str = stream.collect(Collectors.toList());
JSONArray _str = _stream.collect(Collectors.toCollection(JSONArray::new));
}
- for循环+break 被替换
- filter过滤,for循环里的 break 可以用 findFirst
public static void test11(){
String[] str = {"1","2","3","4","5","6","7","8","12","10","11","14"};
List<String> list = Arrays.asList(str);
String s = list.stream().filter( x -> (Integer.parseInt(x))%2 == 0).findAny().get();
System.out.println(s);
/*for (int i = 0; i < str.length; i++) {
if((Integer.parseInt(str[i]))%2 == 0){
System.out.println(str[i]);
break;
}
}*/
}
- 数值比较/求和/排序
public static void test12(){
String[] str = {"1","1","15","4","5","6","7","8","12","10","11","14"};
//转为int后求和
int sum = Arrays.stream(str).mapToInt(x -> Integer.parseInt(x)).sum();
//求和2,自定义
int sum2 = Arrays.stream(str).mapToInt(x -> Integer.parseInt(x)).reduce(2,(m,n)->m+n);
System.out.println(sum+"+2="+sum2);
//最大值max(),最小值min 比较器实现
String max = Arrays.stream(str).max(DemoApplicationTests::compator).get();
//数组长度
long length = Arrays.stream(str).count();
//排序 当前从小到大
List list = Arrays.stream(str).sorted(DemoApplicationTests::compator).collect(Collectors.toList());
System.out.println(list);
System.out.println(length);
System.out.println(sum+"--"+max);
}
private static int compator(String x1, String x2) {
if(Integer.parseInt(x1) < Integer.parseInt(x2)){
return -1;
}else if(Integer.parseInt(x1) == Integer.parseInt(x2)){
return 0;
}else{
return 1;
}
}
- 去重/截取
public static void test13(){
String[] str = {"1","1","15","4","11","6","7","8","12","10","11","14"};
//去重 distinct
List strList = Arrays.stream(str).distinct().collect(Collectors.toList());
//前四(长度)个
List strList1 = Arrays.stream(str).limit(4).collect(Collectors.toList());
//跳过4个
List strList2 = Arrays.stream(str).skip(4).collect(Collectors.toList());
System.out.println(strList2);
}
- limit+skip 实现截取集合
- 分割集合
public static void test14(){
int dayNum = 5;
List<String> strList = Arrays.asList("2","2","2","2","2",
"4","4","4","4","4",
"8","8","8","8","8");
//总天数
int sumDay = strList.size();
//分3周
int week = sumDay%dayNum == 0 ? sumDay/dayNum:sumDay/dayNum+1;
List list = Stream.iterate(0,n->n+1).
//3周
limit(week).
//并行流
parallel().
map(
//循环,并返回值
num -> {
System.out.println(num);
List<String> list1 = strList.stream().
//跳过0*5个,取5个,即 0-5,
//跳过1*5;取5个,5-10,。。。
skip(num * dayNum).
limit(dayNum).
collect(Collectors.toList());
//求和
Double d = list1.stream().mapToDouble(x -> Double.valueOf(x) ).sum();
return d+"";
}
).
collect(ArrayList::new,ArrayList::add,List::addAll);
System.out.println(list);
}
- 数据处理 map,结果收集
public static void test15(){
//构建数据源
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < 6 ; i++) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("mc","mc"+i);
jsonObject.put("xm","word"+i);
jsonArray.add(jsonObject);
}
//创建流
Stream<JSONObject> stream = jsonArray.stream();
//中间操作filter(条件过滤)/map(数据处理返回)/peek(调试时无返回)
Stream<JSONObject> streams = stream.
filter(obj -> !"mc0".equals(obj.getString("mc"))).
map(ele -> {
ele.put("xm","fyhh");
return ele;
});
//终端操作 收集/循环
JSONArray newArr = streams.collect(Collectors.toCollection(JSONArray::new));
//JSONArray newArr = streams.collect(JSONArray::new,JSONArray::add,JSONArray::addAll);
//JSONArray newArr = streams.collect(()-> new JSONArray(),(arrt,json)->{arrt.add(json);},(parr,json) ->{parr.addAll(json);});
//List list = streams.collect(Collectors.toCollection(ArrayList::new));
System.out.println(newArr);
}
- 逻辑与/或
public static void test16(){
List lsi = Arrays.asList("false","true","true");
//逻辑或,只要有一个为"true",即返回true,否则else; false||true||false 结果:false、true、--true(短路)
boolean flg = lsi.stream().anyMatch(x -> {
System.out.print(x+"、");
return "true".equals(x);
});
System.out.println("flg--"+flg);
//逻辑与 false&&true&&false 都为"true",才返回true,否则返回false
boolean flg2 = lsi.stream().allMatch(x -> {
System.out.print(x+"、");
return "true".equals(x);
});
System.out.println("flg2--"+flg2);
//anyMatch 取反,都不是"true",才返回true;否则else,
boolean flg3 = lsi.stream().noneMatch(x -> {
System.out.print(x+"、");
return "true".equals(x);
});
System.out.println("flg3--"+flg3);
}
四、数据收集collect
- List 转 Map
public static void test18(){
List<String> list = Arrays.asList("j","a","k","a","l");
//推荐
Map<String,String> mp = list.stream().collect(HashMap::new,(theMap,ele) -> {
theMap.put(ele,ele+"==");
},Map::putAll);
//不推荐,key重复会有异常 java.lang.IllegalStateException: Duplicate key a==
/* Map<String,String> collect2 = list.stream()
.collect(Collectors.toMap(ele ->ele,
ele ->ele+"=="));*/
System.out.println(mp);
}
- List 转JSONarray
public static void test20(){
List<JSONObject> list = new ArrayList<>();
for (int i = 0; i <4; i++) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("a"+i,22.5*i);
list.add(jsonObject);
}
JSONArray jsonArray = list.stream().collect(JSONArray::new,(theArr,json) -> {
theArr.add(json);
},JSONArray::addAll);
System.out.println(jsonArray);
}
五、文件
public class FileUtils {
public static void main(String[] args) throws IOException, URISyntaxException {
FileUtils fileUtils = new FileUtils();
JSONObject json = fileUtils.getJsonFromCfg("/config/fyjing.json");
System.out.println(json);
}
/**
* json配置文职转为json
*/
public JSONObject getJsonFromCfg(String path) throws URISyntaxException, IOException {
//获取项目的绝对路径
URL allPath = FileUtils.class.getResource(path);
//URI 格式为 f:/F:/......
URI uri = allPath.toURI();
//Paths.get(uri) 为 F:/.....
String jsonStr = Files.lines(Paths.get(uri)).map(x->x.trim()).collect(Collectors.joining());
//字符串转json
JSONObject json = JSONObject.fromObject(jsonStr);
return json;
}
}
六、判断空指针
@Test
public void testw(){
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "2");
String name = getNameJson(jsonObject);
}
private String getNameJson(JSONObject jsonObject) {
return Optional.ofNullable(jsonObject).map(x -> {
String name = x.getString("name");
return name;
}).orElseThrow(()->new RessException("",500));
}
这可能是项目中最实用的java8示例了,还不来看?的更多相关文章
- 在vue-cli项目中使用bootstrap的方法示例
在一个html页面中加入bootstrap是很方便,就是一般的将css和js文件通过Link和Script标签就行. 那么在一个用vue-cli生成的前端项目中如何加入?因为框架不一样了,略微要适应一 ...
- 项目中使用的ajax代码_:觉得还好
POST>> submitHandler:function(form){ var username = $('#user_name').val(); var password = $('# ...
- 如何优雅地在React项目中使用Redux
前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...
- 在Android项目中使用Java8
前言 在过去的文章中我介绍过Java8的一些新特性,包括: Java8新特性第1章(Lambda表达式) Java8新特性第2章(接口默认方法) Java8新特性第3章(Stream API) 之前由 ...
- Spring Boot项目中使用Swagger2
Swagger2是一款restful接口文档在线生成和在线接口调试工具,Swagger2在Swagger1.x版本的基础上做了些改进,下面是在一个Spring Boot项目中引入Swagger2的简要 ...
- 优雅的在React项目中使用Redux
概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在 ...
- vue 项目中实用的小技巧
# 在Vue 项目中引入Bootstrap 有时在vue项目中会根据需求引入Bootstrap,而Bootstrap又是依赖于jQuery的,在使用npm按照时,可能会出现一系列的错误 1.安装jQu ...
- Web 开发中很实用的10个效果【附源码下载】
在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...
- WPF项目中所遇到的一些问题集
1. 没有Timer控件 解决方案: 第一步:申明一个DispatcherTimer 类的变量, private DispatcherTimer timer; //定时控件 第二步:初始化这个类 ti ...
随机推荐
- 码农会锁,synchronized 对象头结构(mark-word、Klass Pointer)、指针压缩、锁竞争,源码解毒、深度分析!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 感觉什么都不会,从哪开始呀! 这是最近我总能被问到的问题,也确实是.一个初入编程职场 ...
- DTU连接不稳定有什么办法
DTU是一种物联网的终端设备,在工业信息化的不断推进的大背景下,DTU的市场需求也越来越大,本身具有网络覆盖范围广.资费低.数据传输准确及时等众多优点.但在使用的过程中DTU会出现很多问题,比如DTU ...
- Java获取不到Canal服务器端数据问题汇总(坑人的东西)
情况1:(基本都是这样的问题,) 1.需要修改canal.properties配置 vim conf/canal.properties canal.instance.parser.parallelTh ...
- 白话科普,10s 了解 API
作为一名又拍云的技术支持工程师,小拍每天都会接收到很多客户的提问.这其中,有很多客户会问:"小拍,请问云存储上传除了使用控制台的文件管理和 FTP 工具之外,有没有其他的途径进行上传呢?&q ...
- 关于windows下redis的安装
1.下载地址:https://github.com/MSOpenTech/redis/releases 2.DOS下进redis文件夹目录,执行redis-server.exe redis.windo ...
- 对比JAVA、Python、C、Go运行时间,我惊呆了!!!
对比JAVA.Python.C.Go运行时间,我惊呆了!!! 周末在寝室刷完算法,想放松一下,于是做了一个实验:用现在主流的几种编程语言对0 - (10000000 - 1)求和,结果我惊呆了,话不多 ...
- ci框架根据配置自动生成controller控制器和model控制器(改版本)
CI修改如下: if($modle_file=config_item('modle_file')) { if ($modle_file === TRUE) { $modle_file=config_i ...
- python数据分析03Python的数据结构、函数和文件
我们会从Python最基础的数据结构开始:元组.列表.字典和集合.然后会讨论创建你自己的.可重复使用的Python函数.最后,会学习Python的文件对象,以及如何与本地硬盘交互. 3.1 数据结构和 ...
- lambda表达式的distinct去重
天真的我最开始以为可以写成list.distinct(x=>x.name);以为这样就可以按照name去重了,结果是不行的.这里记录下正确的用法. 1.这里是针对int集合 可以满足 #reg ...
- Collection迭代器Iterator的使用
package com.cx.Collecion; import java.util.ArrayList; import java.util.Collection; import java.util. ...