1、lambda 表达式

lambda 的延迟执行

可以对程序进行优化,尤其是使用 if {} else {} 条件判断,先判断条件是否成立,再传入计算好的参数。

functionName( paramters, () -> { } );

2、stream 流式思想

stream 是jdk8之后出现的语法

拼接流式模型:建立一个生产线,按照生产线来生产商品

经过了过滤、映射、跳过、计数等多步操作,集合元素的处理方案

filter、map、skip,得益于lambda的延迟执行特性。

(1) 获取流

数据源流的来源:集合、数组

java.util.stream.Stream<T>

// 所有的Collention 集合 (   list, map, set..   )都可以通过stream默认方法获取流
ArrayList<String> arrStr = new ArrayList();
stream<String> stream1 = arrStr.stream(); // Stream接口的静态方法 of 可以获取数组对应的流
Stream<Integer> Stream2 = Stream.of(1, 4, 3, 5, 5);
// Stream 流只能使用一次,使用完之后就直接关闭了。即
Stream<String> stream3 = Stream.of("1", "2", "9", "4");
stream3.forEach((String str)-> {
System.out.println(str);
}); // 再重新打印一次,输出异常
stream3.forEach((String str)-> {
System.out.println(str); });

(2)取用前几个:limit  如果当前长度大于参数进行截取,否则不截取。limit 是一个延迟方法,返回的是一个新的流

Stream<String> stream4 = stream3.limit(2);
stream4.forEach( str -> System.out.println(str) );

(3)跳过前几个:skip  与 limit 相反

(4)流拼接: concat

java 泛型

java泛型不允许静态化,类中含有 static 会报错:

// 分类:
// 1、泛型类
public class 类名<T> { } // 2、泛型接口
public interface Generator<T> { } // 3、泛型方法
类型通配符 ?

区别:
<? extends T> 该通配符所代表的类型是T类型的子类

<? super T> 该通配符所代表的类型是T类型的父类

反射提供的是runtime阶段获取类的class 实例、方法、属性、注解, 并且能够调用勒的方法的途径。

java 多线程

PS:查阅了相关资料和视频,这种类似于计算机内核原理的知识,建议翻阅教科书,了解一下什么是堆,栈,缓冲区等计算机专属词汇,网上很多人讲的不严谨,如果有人想深入大体了解内部机制,强烈安利这个教程 计算机系统基础,有好几季,课程比较长,虽然比较难

并行:指两个或多个事件在同一时刻运行(同时运行)。

并发:指两个或多个事件在同一个时间间隔内发生。

线程与进程两者的关系图,推荐看这个图,比较严谨:

https://blog.csdn.net/weixin_41490593/article/details/90704559

多线程编程:

Java中线程有四种创建方式:

l  继承Thread类

l  实现Runnable接口

l  实现Callable接口

l  线程池

前三种方法相应的资料很多,这里仅仅粗略赘述线程池:

/*
java.util.concurrent.ExecutorService 线程池接口 线程池:容器 -- > 集合框架( ArrayList, HashSet, LinkedList<Thread>, HashMap ) 接口: static ExecutorService newFixedThreadPool(int nThreads) 创建一个可重用固定线程数的线程池 ExecutorService 接口,返回的是ExecutorService接口的实现类对象,可用ExecutorService接口接收(面向接口编程) submit() 执行线程 线程池会一直开启,使用完了线程,会自动吧线程归还给线程池,线程可以继续执行。 shutdown() 关闭执行, 如果已经执行了此方法,如果重新 使用 submit 方法, 会报错 。 线程池的使用步骤: 1、使用线程池的工厂类 Executors 里面提供的 newFixedThreadPool 生产一个指定线程池数量的线程池 2、创建一个类,实现 Runnable 接口,重写 run 方法,设置线程任务 3、调用ExecutorService 中的方法 submit ,传递线程任务(实现类), 开启线程, 执行 run 方法 4、调用ExecutorService 中的方法 shutdown ,销毁线程池 */
进程间协作:

wait : 是object 类中的一个方法,当前线程释放自己的锁标记,让出CPU资源,当前的线程进入到等待队列中

notify: 是object 类中的一个方法,唤醒等待队列中的一个进程,使这个线程进入锁池

notifyAll : 唤醒等待队列中的等待当前对象的所有线程,并使这些线程进入锁池

java线程同步机制:

锁,通俗地讲就是告诉其他的线程,这里的鱼塘我承包了,等我解锁你再用

同步锁: 多个线程看到的锁, 需要是同一把锁。

静态方法:同步锁就是类锁,  当前类.class  属性  --> class 文件对象,这一点涉及到 java反射,静态方法优先于对象。

非静态方法: 同步锁 是 this,this 是在创建对象之后产生的。

Runnable r = () -> {
while(TicketCenter.restCount > 0 ) {
// synchronized ("") {
synchronized (Generic.class) {
if (TicketCenter.restCount <= 0) {
return ;
}
System.out.println("当前运行的进程 : " + Thread.currentThread().getName() + " " + --Center.restCount);
}
}
}; Thread t1 = new Thread(r, "thread - 1");
Thread t2 = new Thread(r, "thread - 2");
Thread t3 = new Thread(r, "thread - 3");
Thread t4 = new Thread(r, "thread - 4"); t1.start();
t2.start();
t3.start();
t4.start();
class Center {
public static int restCount = 100; } // 如果一个方法需要执行同步操作,直接加入 synchronize 关键字
// 同步方法
private synchronized static void funControl() {
// synchronized (Generic.class) {
if (TicketCenter.restCount <= 0) {
return ; }
System.out.println("当前运行的进程 : " + Thread.currentThread().getName() + " " + --TicketCenter.restCount);
// }
}
显式锁 : ReentrantLock  重入锁

当接触临界区时 ReentrantLock 是在 Lock 接口实现的。临界资源由 lock() 和 unlock() 组成。lock() 就是让当前工作进程进入资源,然后使其他的试图进入临界资源的进程阻塞。

ReentrantLock 能够让进程不止一次的进入资源。当这个进程第一次进入内存的时候,有一个计数器记为1,在解锁之前,一个进程又进入时,计数器递增1,每一次unlock() 时,计数器递减1。当计数器为0时,资源被解锁。

Reentrant Locks 可重入锁还提供一个公平性参数,通过该参数,锁将遵守锁请求的顺序,即在线程解锁资源后,锁将转到等待时间最长的线程。此公平模式是通过将true传递给锁的构造函数来设置的。

/*
* 实例化一个锁对象
*/
ReentrantLock lock = new ReentrantLock(); Runnable r = () -> {
while(TicketCenter.restCount > 0 ) {
// 临界资源上锁
lock.lock(); if (TicketCenter.restCount <= 0) {
return ;
}
System.out.println("当前运行的进程 : " + Thread.currentThread().getName());
// 解锁
lock.unlock();
}
};
public void some_method()
{
reentrantlock.lock();
try
{
//Do some work
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
reentrantlock.unlock();
} }
// volatile关键字 以及 CAS与原子变量使用的不多,这里就不再赘述了。

Java | Stream流、泛型、多线程 | 整理自用的更多相关文章

  1. 全面吃透JAVA Stream流操作,让代码更加的优雅

    全面吃透JAVA Stream流操作,让代码更加的优雅 在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行 ...

  2. 一文带你入门Java Stream流,太强了

    两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:"就想看你写的啊!"你看你看,多么苍白的喜欢啊.那就&qu ...

  3. 深度掌握 Java Stream 流操作,让你的代码高出一个逼格!

    概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream 的操作符大体上分为两种:中间操作符和终止操作符 中 ...

  4. Java Stream 流如何进行合并操作

    1. 前言 Java Stream Api 提供了很多有用的 Api 让我们很方便将集合或者多个同类型的元素转换为流进行操作.今天我们来看看如何合并 Stream 流. 2. Stream 流的合并 ...

  5. Java Stream 流(JDK 8 新特性)

    什么是 Steam Java 8 中新增了 Stream(流)来简化集合类的使用,Stream 本质上是个接口,接口中定义了很多对 Stream 对象的操作. 我们知道,Java 中 List 和 S ...

  6. Java Stream流的使用

    流相关的方法可以分为三种类型,分别是:获取Stream流.中间方法.终结方法.中间方法会返回当前流,可以方便的进行链式调用. 流不可重复使用,否则会报错: java.lang.IllegalState ...

  7. Java Stream流排序null以及获取指定条数数据

    Java8的Stream流的一些用法, //排序 carerVehEntityList = carerVehEntityList.stream().sorted( Comparator.compari ...

  8. Java Stream简介, 流的基本概念

    在Javaor .net编程中,  我们经常见到"stream" 这个字眼. 我们大概知道这是个流的意思, 如果看完本文的话, 应该会有1个大概的概念. 一, Java中什么是St ...

  9. Java Stream 自定义Collector

    Collector的使用 使用Java Stream流操作数据时,经常会用到各种Collector收集器来进行数据收集. 这里便深入了解一点去了解Collector的工作原理和如何自定义Collect ...

随机推荐

  1. 听说你买的基金又“绿了”,手把手教你用 Python选出好基金

    打工人打工魂打工都是人上人,红基金绿基金绿了又绿你基金.今天教大家一招不再被(基金)绿. 01 开发环境 Windows10 Python3 Pycharm 一些必要的库 02 步骤 1. 获取基金排 ...

  2. Nginx隐藏式跳转(浏览器URL跳转后保持不变) - 运维笔记

    Nginx的隐藏式跳转可以实现将请求跳转到另一个网站的页面,并且浏览器中URL保持不变.Nginx配置中需要使用rewrite规则.下面提供两个示例来说明这种跳转需求的配置: 一.配置示例1将请求路径 ...

  3. vue.js中$emit的理解

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  4. PAT 乙级 -- 1002 -- 写出这个数

    题目: 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式:在一行内输出n的各位数字 ...

  5. hdu5247找连续数(打表)

    题意(中问题直接粘题意吧)                                 找连续数 Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否 ...

  6. Github搜索语法

    目录 使用 Github 进行邮件配置信息收集 使用Github进行数据库信息收集

  7. Win64 驱动内核编程-13.回调监控模块加载

    回调监控模块加载 模块加载包括用户层模块(.DLL)和内核模块(.SYS)的加载.传统方法要监控这两者加在必须 HOOK 好几个函数,比如 NtCreateSection 和 NtLoadDriver ...

  8. NumPy之:理解广播

    目录 简介 基础广播 广播规则 简介 广播描述的是NumPy如何计算不同形状的数组之间的运算.如果是较大的矩阵和较小的矩阵进行运算的话,较小的矩阵就会被广播,从而保证运算的正确进行. 本文将会以具体的 ...

  9. 对标印度的PostMan,一款中国接口测试软件的崛起

    对于我们开发者,Api接口调试一定不陌生.包括我在内,之前进行Api调试时,一直使用的是一款印度的软件Postman.记得刚入手的时候,由于该款软件缺乏中文版本,上手一直比较慢,而且还至少存在如下几个 ...

  10. 语音降噪论文“A Hybrid Approach for Speech Enhancement Using MoG Model and Neural Network Phoneme Classifier”的研读

    最近认真的研读了这篇关于降噪的论文.它是一种利用混合模型降噪的方法,即既利用了生成模型(MoG高斯模型),也利用了判别模型(神经网络NN模型).本文根据自己的理解对原理做了梳理. 论文是基于" ...