​一、组成及特点

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

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

    三、中间操作
  • 字符串操作拼接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. java如何实现一个Future

    实现Futrue接口 public class MsgFuture<V> implements java.util.concurrent.Future<V> { ... ... ...

  2. 教师专用录微课及剪辑软件推荐-camtasia中文汉化破解版免费下载及使用教程

    教师专用录微课软件,微课制作软件是一款能够制作文字.图形.动画.音视频等的软件,支持对ppt.word.flash的导入和录制,实时同步录制操作区文字.图形.动画.音视频.鼠标轨迹.声音及外部语音等动 ...

  3. Zotero导入Markdown here插件

    1. 下载Markdown Here源码包 网址:https://github.com/adam-p/markdown-here 2. 创建.xpi后缀文件 将文件夹 中的这几个文件放入同一个文件夹中 ...

  4. python给图片添加文字

    如何用几行代码给图片加上想要的文字呢? 下面为大家说下实现过程. 关注公众号 "轻松学编程"了解更多. 有图如下,想添加自写的诗句 诗句 静安心野 朝有赤羽暮落霞, 小舟载我湖旋停 ...

  5. JS对象创建的几种方式整理

    ​ 本文主要介绍了JS对象创建的几种方式 第一种:Object构造函数创建 var Person = new Object(); Person.name = 'Nike'; Person.age = ...

  6. 80386学习(一) 80386CPU介绍

    一.80386CPU介绍 Inter80386CPU是Inter公司于1985年推出的第一款32位80x86系列的微处理器.80386的数据总线是32位的,其地址总线也是32位,因而最大可寻址4GB的 ...

  7. 部署Dotnet Core应用到Kubernetes(一)

    最近闲了点,写个大活:部署Dotnet应用到K8s.   写在前边的话 一直想完成这个主题.但这个主题实在太大了,各种拖延症的小宇宙不时爆发一下,结果就拖到了现在.   这个主题,会是一个系列.在这个 ...

  8. 虚拟机中安装Centos 7

    VMware中安装centos7系统 一.首先需要准备必要文件 1.VMware软件的安装包,建议使用12以上版本 VMwareWorkstation14版本下载链接 链接:https://pan.b ...

  9. Oracle(第二天)

    一.外键(foreign key):constraint , refenerces 例如:sno number(7) constraint fk_sno references student(sno) ...

  10. 从头学起Verilog(一):组合逻辑基础与回顾

    引言 该部分主要回顾了本科时数字电路中组合逻辑电路部分,内容相对简单和基础. 内容主要包括:布尔代数相关知识,卡诺图,最大项与最小项,竞争和冒险以及一些常见模块 数字电路中的逻辑 组合逻辑:输出可以表 ...