Java 8 新特性之 Stream 流(六)收集
我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些元素,并以集合的方式返回,我们把这种反向操作称为收集。 流API也给我们提供了相应的方法。 如何在流中使用收集功能?我们先看一看流API给我们提供的方法: public interface Stream<T> extends BaseStream<T, Stream<T>> { //...忽略那些不重要的东西 <R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner); <R, A> R collect(Collector<? super T, A, R> collector); } 流API中给我们提供了...
Java 8 新特性之Stream流
是什么是Stream流java.util.stream.Stream Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西。 流可以简单的说是处理数据集合的东西,可以申明式流式API来处理集合,而不是写一个逻辑实现。 流分类流分为顺序流及并行流,顺序流即每个指令按顺序执行,并行流即集合里面的操作并行执行。 List<Integer> numbers = Arrays.asList(1, 2, 3); // 顺序流 numbers.stream().forEach(n -> System.out.print(n)); //并行流 numbers.parallelStream().forEach(n -> System.out.print(n)); 以上例子,顺序流总是输出123,而并行流则每次结果都不一定,并行流使用了ForkJoinPool分而治之,所以明白了ForkJoinPool原理的同学就知道并行流的真面目了。 创建流1、调用集合的stream()方法或者parallelSt...
Java 8 新特性之 Stream 流(四)并行流
随着对流API认识的慢慢深入,本章我们要讨论的知识点是流API里面的并行流了。 在开始讨论并行流之前,我先引发一下大家的思考,就你看到这篇文章的时间,你们是不是经常听到,Intel i7 CPU什么8核16线程,什么Android手机8核4GB这种消息,既然我们是处于一个多核处理器的时代,你们有没有想过并行地操作数组和集合框架,从而高速地执行我们对数组或者集合的一些操作呢? 或许你有想过这个问题,但是因为并行编程比较复杂,所以这些想法还停留在你的脑海当中,又或者你已经在路上了,反正你们就是最棒的(我他妈都这么夸你们了,就不能点个喜欢?)。 不管如何,在你看到这一篇文章的时候,我将带你走向并行地操作数组或者集合,当然是使用我们的并行流知识啦。 并行流并行编程可谓是十分复杂并且很容易出错的,这估计就是我们绝大部分人的拦脚石。刚好Stream流库给我们解决了这个问题,在流API库里面提供了轻松可靠的并行操作。要想并行处理流相当简单,只需要使用一个并行流就可以了。 如第二篇文章中提到的那样,我们获取一个并行流是非常简单的,只需要对流调用一下parallel()就可以获取到一个并行流了(什...
10 个深恶痛绝的 Java 异常
异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题。 什么是异常及异常的分类请看这篇文章:一张图搞清楚 Java 异常机制。 今天,栈长来列一下 Java 中经常遇到的前 10 个异常,排名不分先后。 1、NullPointerException空指针异常,操作一个 null 对象的方法或属性时会抛出这个异常。具体看这篇文章:Java 避免空指针的 5 个案例。 2、OutOfMemoryError内存异常异常,这不是程序能控制的,是指要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序。 3、IOExceptionIO,即:input, output,我们在读写磁盘文件、网络内容的时候经常会生的一种异常,这种异常是受检查异常,需要进行手工捕获。 如文件读写会抛出 IOException: public int read() throws IOException public void write(int b) throws IOException 4、Fi...
Java Base64 编码解码方案总结
Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便。在实际应用上,Base64除了能将Binary资料可视化之外,也常用来表示字串加密过后的内容。如果要使用Java 程式语言来实作Base64的编码与解码功能,可以参考本篇文章的作法。 早期作法早期在Java上做Base64的编码与解码,会使用到JDK里sun.misc套件下的BASE64Encoder和BASE64Decoder这两个类别,用法如下: final BASE64Encoder encoder = new BASE64Encoder(); final BASE64Decoder decoder = new BASE64Decoder(); final String text = "Java技术"; final byte[] textByte = text.getBytes("UTF-8"); //编码 final String e...
Java Jar包压缩、解压使用指南
什么是jar包JAR(Java Archive)是Java的归档文件,它是一种与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。 如何打/解包使用jdk/bin/jar.exe工具,配置完环境变量后直接使得jar命令即可。 jar命令格式jar {c t x u f }[ v m e 0 M i ][-C 目录]文件名… {ctxu},这四个参数必须选选其一。 [v f m e 0 M i],这几个是可选参数,文件名也是必须的。 参数 说明 -c 创建一个jar包 -t 显示jar中的内容列表 -x 解压jar包 -u 添加文件到jar包中 -f 指定jar包的文件名 -v 输出详细报告 -m 指定MANIFEST.MF文件 -0 生成jar包时不压缩内容 -M 不生成清单文件MANIFEST.MF -i 为指定的jar文件创建索引文件 -C 可在相应的目录下执行命令 关于MANIFEST.MF定义: https://baike.baidu.com/item/MANIFEST.MF ...
Java 父类强制转换子类原则
最近,微信群友在讨论子类父类的转换问题,其实不难,给大家用实例来说明一下就很明了了。 我们知道Java中子类转换成父类是没有任何问题的,那父类可以转换成子类吗? 来看下面这段程序: public class TestObjectConvert { public static void main(String[] args) { test1(); test2(); } private static void test1() { Fruit fruit1 = new Fruit(); Apple apple1 = new Apple(); apple1 = (Apple) fruit1; // java.lang.ClassCastException } private static void test2() { Fruit fruit1 = new Apple(); Apple apple1 = new Ap...
Java 中的基本数据类型转换详解
说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,如下图所示。 之前分享过《深入浅出 Java 中的包装类》,现在重新温故了下原始数据类型,现在来解释下它们之间的转换关系。 自动类型转换自动类型转换是指:数字表示范围小的数据类型可以自动转换成范围大的数据类型。 如: long l = 100; int i = 200; long ll = i; 具体自动转换如如下图所示。 实线表示自动转换时不会造成数据丢失,虚线则可能会出现数据丢失问题。 自动转换也要小心数据溢出问题,看下面的例子。 int count = 100000000; int price = 1999; long totalPrice = count * price; 编译没任何问题,但结果却输出的是负数,这是因为两个 int 相乘得到的结果是 int, 相乘的结果超出了 int 的代表范围。这种情况,一般把第一个数据转换成范围大的数据类型再和其他的数据进行运算。 int count ...
switch case 支持的 6 种数据类型!
Java 中 switch case 语句用来判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。 语法格式如下: switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可选 //你可以有任意数量的case语句 default : //可选 //语句 } 这里的 expression 都支持哪些类型呢? 基本数据类型:byte, short, char, int 包装数据类型:Byte, Short, Character, Integer 枚举类型:Enum 字符串类型:String(Jdk 7+ 开始支持) 基本数据类型和字符串很简单不用说,下面举一个使用包装类型和枚举的,其实也不难,注意只能用在 s...
StringBuffer 和 StringBuilder 的 3 个区别
StringBuffer 和 StringBuilder 它们都是可变的字符串,不过它们之间的区别是 Java 初中级面试出现几率十分高的一道题。这么简单的一道题,栈长在最近的面试过程中,却经常遇到很多求职者说反,搞不清使用场景的情况。 今天,栈长我带大家彻底搞懂 StringBuffer 和 StringBuilder 的几个区别和它们的应用场景,如果你是大牛,请略过,如果你是菜鸟,或者对这两个不是很清楚,可以学习一下,也可以为年底的面试加油冲刺。 先看看 StringBuffer 和 StringBuilder 的类结构吧: 其实很简单,就是继承了一个抽象的字符串父类:AbstractStringBuilder。下面我们再来看看它们的三个区别。 区别1:线程安全StringBuffer:线程安全,StringBuilder:线程不安全。因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 StringBuilder 修饰。 StringBuffer 代码片段: @Override public sync...
