ASList

java8新特性五-Stream

一笑奈何 提交于 2020-12-06 08:34:28
引言 继上次学习过Java8中的非常重要的Lambda表达式之后,接下来就要学习另一个也比较重要的知识啦,也就如标题所示:Stream,而它的学习是完全依赖于之前学习的Lambda表达式。 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。 +--------------------+ +------+ +------+ +---+ +-------+ | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| +--------------------+ +------+ +------+ +---+ +-------+ 以上的流程转换为 Java 代码为: class

Java Stream 源码分析

天涯浪子 提交于 2020-12-03 16:47:33
前言 Java 8 的 Stream 使得代码更加简洁易懂,本篇文章深入分析 Java Stream 的工作原理,并探讨 Steam 的性能问题。 Java 8 集合中的 Stream 相当于高级版的 Iterator,它可以通过 Lambda 表达式对集合进行各种非常便利、高效的聚合操作(Aggregate Operation),或者大批量数据操作 (Bulk Data Operation)。 Stream的聚合操作与数据库SQL的聚合操作sorted、filter、map等类似。我们在应用层就可以高效地实现类似数据库SQL的聚合操作了,而在数据操作方面,Stream不仅可以通过串行的方式实现数据操作,还可以通过并行的方式处理大批量数据,提高数据的处理效率。 操作分类 官方将 Stream 中的操作分为两大类: 中间操作(Intermediate operations) ,只对操作进行了记录,即只会返回一个流,不会进行计算操作。 终结操作(Terminal operations) ,实现了计算操作。 中间操作又可以分为: 无状态(Stateless)操作 ,元素的处理不受之前元素的影响。 有状态(Stateful)操作 ,指该操作只有拿到所有元素之后才能继续下去。 终结操作又可以分为: 短路(Short-circuiting) 操作,指遇到某些符合条件的元素就可以得到最终结果

Kafka03--Kafka消费者使用方式

…衆ロ難τιáo~ 提交于 2020-11-24 14:26:22
前言   与生产者客户端一样,消费者端也由最初的scala版本过渡到现在的Java版本。   正常的消费者逻辑需要以下4个步骤: KafkaConsumer的客户端参数配置和对应实例; 订阅主题 拉取消息并消费 提交消费者位移 关闭消费者实例   消费者客户端比较特殊的一点是加入了消费者组的概念; KafkaConsumer消费者组   默认情况下: 一个消费者组中的每个消费者会分配到不同的分区; 一个topic中的消息只会被一个消费者组 消费一次 ; 若一个组中的消费者数量多于partition数量,会出现消费者不会被分配分区,也就消费不到消息(如下c7消费不到数据); KafkaConsumer使用示例 1 public class KafkaConsumerAnalysis { 2 public static final String brokerList = "10.26.28.99:9092" ; 3 public static final String topic = "demo" ; 4 public static final String groupId = "group.demo" ; 5 public static final AtomicBoolean isRunning = new AtomicBoolean( true ); 6 7 public

自动拆装箱与遍历

筅森魡賤 提交于 2020-11-24 12:49:07
一、实例 源码: List<Integer> list = Arrays.asList(1, 2); int sum = 0; for (int i : list) { sum += i; } System.out.println(sum); 编译后: List<Integer> list = Arrays.asList( new Integer[] { Integer.valueOf(1), Integer.valueOf(2) }); int sum = 0; for (Iterator localIterator = list.iterator(); localIterator.hasNext(); ) { int i = ((Integer)localIterator.next()).intValue(); sum += i; } System.out.println(sum); 二、陷阱(源码) Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 321; Integer f = 321; Long g = 3L; System.out.println(c == d); System.out.println(e == f); System.out.println(c == (a+b

JAVA8之lambda表达式详解及使用

♀尐吖头ヾ 提交于 2020-11-23 05:39:53
原文:https://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.lambda表达式的优缺点? 4.lambda表达式的使用场景? 5.lambda只是一个语法糖吗? 二.概念 lambda表达式是JAVA8中提供的一种新的特性,它支持JAVA也能进行简单的“函数式编程”。 它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。 三.先看看效果 先看几个例子: 1.使用lambda表达式实现Runnable package com.lambda; /** * 使用lambda表达式替换Runnable匿名内部类 * @author MingChenchen * */ public class RunableTest { /** * 普通的Runnable */ public static void runSomeThing(){ Runnable runnable = new Runnable() { @Override public void run() { System.out.println("I am

Java元素删除结合的方法集合

馋奶兔 提交于 2020-11-13 00:56:48
首先要看你的List是怎么生成的,比如: List<String> strList = Arrays.asList ("a", "b", "aa", "ab", "ba"); 这种方式生成的List是 不能改变的(fixed size) ,具体可以参见源码。 比如下面这种方式生成的List是可以改变的: List<String> strList2 = new ArrayList <>(); strList2.add("a"); strList2.add("ab"); strList2.add("ac"); strList2.add("ad"); 以下测试都采用这个List. package com.cc.test; import cn.hutool.core.lang.Console; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; public class TestDemo { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add(

Apache的commons-collections4集合工具类CollectionUtils工具类

孤者浪人 提交于 2020-11-10 18:04:48
这篇讲的CollectionUtils工具类是在apache下的, 而不是springframework下的CollectionUtils。 个人觉得CollectionUtils在真实项目中,可以使你的代码更加简洁和安全。 所以需要倒入相关jar包,目前从maven找到最新jar包如下: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.3</version> </dependency> 一、API常用方法 /** * 1、除非元素为null,否则向集合添加元素 */ CollectionUtils.addIgnoreNull(personList,null); /** * 2、将两个已排序的集合a和b合并为一个已排序的列表,以便保留元素的自然顺序 */ CollectionUtils.collate(Iterable<? extends O> a, Iterable<? extends O> b) /** * 3、将两个已排序的集合a和b合并到一个已排序的列表中,以便保留根据Comparator c的元素顺序。 */ CollectionUtils.collate(Iterable<? extends O> a,

2020-10-31

 ̄綄美尐妖づ 提交于 2020-11-02 13:05:53
Arrays工具类——数组与集合之间的相互转换 Arrays.asList() Collection.toArray() 前言 Arrays.asList():返回由指定数组支持的固定大小的列表。(将返回的列表更改为“写入数组”。)该方法作为基于数组和基于集合的API之间的桥梁,Collection.toArray()相结合 。返回的列表是可序列化的,并实现RandomAccess 。 Collection.toArray():返回一个包含此集合中所有元素的数组。如果此集合对其迭代器返回的元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。 返回的数组将是“安全的”,因为该集合不保留对它的引用。 (换句话说,这个方法必须分配一个新的数组,即使这个集合是由数组支持的)。因此,调用者可以自由地修改返回的数组。 提示:以下是本篇文章正文内容,下面案例可供参考 1. Arrays.asList() package Work . day1 ; import java . util . Arrays ; import java . util . Iterator ; import java . util . List ; public class Work5 { public static void main ( String [ ] args ) { String [ ] str =

ADT

三世轮回 提交于 2020-11-01 11:33:53
需要读的reading MIT6.031 12,13,14 ADT:abstract data type 抽象数据类型 抽象类型:强调“ 作用于数据上的操作”,程序员和 client 无需关心数据如何具体存储的,只需设计 / 使用操作即可。 ADT 是由操作定义的,与其内部如何实现无关! AF:abstraction functions 抽象函数 RI:representation invariants 表示不变量 ADT和RI:如何设计良好的数据结构,通过封装来避免客户端获取数据的内部表示(即表示泄露) 避免潜在的bug--在client和implementer之间建立防火墙 ADT的特性: Invariant 不变量 representation exposure 表示泄露 abstraction functions(AF) 抽象函数 Mutable and immutable types 可变类型的对象:提供了可改变其 内部数据的值的操作 不变数据类型: 其操作不改变 内部值,而是构造新的对象 有时一种类型会提供两种类型,可变数据类型和不可变数据类型 就像StringBuilder是String的可变版本 一个抽象类型的操作可以分为以下四种: Creater:构造器 构造器:可能实现为构造函数或静态函数 就像new ArrayList(),或者静态方法Arrays

Arrays.asList()返回ArrayList调用remove()或add()出现 java.lang.UnsupportedOperationException异常

六月ゝ 毕业季﹏ 提交于 2020-10-29 09:51:36
Iterator和ListIterator可以对集合遍历同时可以做remove操作, 但在调用Arrays.asList()转化为ArrayList的过程中并不能调用remove() public class Test { public static void main(String[] args) { List<String> list = test(); Iterator<String> it = list.iterator(); while (it.hasNext()) { String str = it.next(); System.out.println(str); if (str.equals("a")) { it.remove(); // TODO: 在这出错了!!! java.lang.UnsupportedOperationException } } } private static List<String> test() { // TODO: 返回的是java.util.Arrays$ArrayList List<String> list = Arrays.asList("a", "b", "c"); list.sort( (e1, e2 ) -> e1.compareTo(e2) ); return list; } } 异常: Exception in