​一、组成及特点

  • 数据源、中间操作、终端操作
  • 流只能使用一次
  • 并行流 和 串行流

    二、可以产生流的数据源
  • 集合、文件

    三、中间操作
  • 字符串操作拼接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示例了,还不来看?的更多相关文章

  1. 在vue-cli项目中使用bootstrap的方法示例

    在一个html页面中加入bootstrap是很方便,就是一般的将css和js文件通过Link和Script标签就行. 那么在一个用vue-cli生成的前端项目中如何加入?因为框架不一样了,略微要适应一 ...

  2. 项目中使用的ajax代码_:觉得还好

    POST>> submitHandler:function(form){ var username = $('#user_name').val(); var password = $('# ...

  3. 如何优雅地在React项目中使用Redux

    前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...

  4. 在Android项目中使用Java8

    前言 在过去的文章中我介绍过Java8的一些新特性,包括: Java8新特性第1章(Lambda表达式) Java8新特性第2章(接口默认方法) Java8新特性第3章(Stream API) 之前由 ...

  5. Spring Boot项目中使用Swagger2

    Swagger2是一款restful接口文档在线生成和在线接口调试工具,Swagger2在Swagger1.x版本的基础上做了些改进,下面是在一个Spring Boot项目中引入Swagger2的简要 ...

  6. 优雅的在React项目中使用Redux

    概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在 ...

  7. vue 项目中实用的小技巧

    # 在Vue 项目中引入Bootstrap 有时在vue项目中会根据需求引入Bootstrap,而Bootstrap又是依赖于jQuery的,在使用npm按照时,可能会出现一系列的错误 1.安装jQu ...

  8. Web 开发中很实用的10个效果【附源码下载】

    在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...

  9. WPF项目中所遇到的一些问题集

    1. 没有Timer控件 解决方案: 第一步:申明一个DispatcherTimer 类的变量, private DispatcherTimer timer; //定时控件 第二步:初始化这个类 ti ...

随机推荐

  1. vivo 基于原生 RabbitMQ 的高可用架构实践

    一.背景说明 vivo 在 2016 年引入 RabbitMQ,基于开源 RabbitMQ 进行扩展,向业务提供消息中间件服务. 2016~2018年,所有业务均使用一个集群,随着业务规模的增长,集群 ...

  2. javascript模块化(简)

    这里书写一个个人理解以及整理的东西,关于模块化以及ES6语法推荐大家阅读阮一峰老师的ES6入门教程 地址:https://es6.ruanyifeng.com/ 比较散,请见谅 以前的js是没有模块化 ...

  3. win32之临界区

    线程安全问题 每个线程都有自己的栈,而局部变量是存储在栈中的,这就意味着每个线程都有一份自己的"局部变量",如果线程 仅仅使用 "局部变量" 那么就不存在线程安 ...

  4. 【转】Extension Libraries and Loading Other Image Formats

    FROM: http://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/index. ...

  5. Nginx跳转配置

    1.携带目录调转到后端,后端无目录,location配置如下 例子: i2.jusdacfj.com/ideas_edi/--10.0.2.137:7040/10.0.2.138:7040 locat ...

  6. mysql处理数据库事务

    数据库事务 关注公众号"轻松学编程"了解更多. 1.概念 ​ 执行批量操作时,这些操作作为一个整体,要么全部成功,要么全部失败.如银行转账,己方扣钱.对方加钱,这两个操作是一个整体 ...

  7. 正式班D23

    2020.11.05星期四 正式班D23 目录 12.3.3 HUP信号 12.3.3 HUP信号 在关闭终端时,终端会收到Linux HUP信号(hangup信号),关闭其所有子进程. 想让进程一直 ...

  8. streamreader

    using (StreamReader sr = new StreamReader(@"C:\Documents and Settings\Administrator\桌面\1.txt&qu ...

  9. 设计师建筑师太难了,既要学BIM、无人机,还要学GIS!

    我,一个平平无奇的城市规划专业(建筑专业.路桥专业)大学生,还有一年要毕业,很担心工作以后受到社会的毒打,遂问导师和学长,我要自学点什么技能和软件? 学长A:CAD,SketchUp,PS我都很熟练了 ...

  10. 性能工具-CPU