Java 8 基础API的一些小的该进
Java8是一个较大改变的版本,包含了API和库方面的修正,它还对我们常用的API进行很多微小的调整, 下面我会带你了解字符串、集合、注解等新方法。
字符串
经常会遇到这样一种情况, 需要将一组字符串按特定格式拼接起来。
之前的写法
String message = "Java"+"-"+"is"+"-"+"cool";
Java 8的join写法
String message = String.join("-", "Java", "is", "cool");
当然更多的时候是要遍历集合里的字符串,然后按特定格式拼接:
之前的写法
List<String> strings = new LinkedList<>();
strings.add("Java");
strings.add("is");
strings.add("cool"); String message = "";
for (int i = 0; i < strings.size(); i++) {
message += strings.get(i)+"-";
}
message = message.substring(0, message.length()-1);
join写法
List<String> strings = new LinkedList<>();
strings.add("Java");strings.add("is");
strings.add("cool");
String message = String.join(" ", strings);
第一个参数是分隔符,后面接收一个CharSequence类型的可变参数数组或一个Iterable。
集合
集合改变中最大的当属前面章节中提到的Stream API,除此之外还有一些小的改动。
- Map中的很多方法对并发访问十分重要,我们将在后面的章节中介绍
- Iterator提供forEachRemaining将剩余的元素传递给一个函数
- BitSet可以产生一个Stream对象
通用目标类型判断
Java8对泛型参数的推断进行了增强。相信你对Java8之前版本中的类型推断已经比较熟悉了。 比如,Collections中的方法emptyList方法定义如下:
static <T> List<T> emptyList();
emptyList方法使用了类型参数T进行参数化。 你可以像下面这样为该类型参数提供一个显式的类型进行函数调用:
List<Person> persons = Collections.<Person>emptyList();
不过编译器也可以推断泛型参数的类型,上面的代码和下面这段代码是等价的:
List<Person> persons = Collections.emptyList();
我还是习惯于这样书写。
注解
Java 8在两个方面对注解机制进行了改进,分别为:
- 可以定义重复注解
- 可以为任何类型添加注解
重复注解
之前版本的Java禁止对同样的注解类型声明多次。由于这个原因,下面的第二句代码是无效的:
@interface Basic {
String name();
}
@Basic(name="fix")
@Basic(name="todo")
class Person{ }
我们之前可能会通过数组的做法绕过这一限制:
@interface Basic {
String name();
}
@interface Basics {
Basic[] value();
}
@Basics( { @Basic(name="fix") , @Basic(name="todo") } )
class Person{ }
Book类的嵌套注解相当难看。这就是Java8想要从根本上移除这一限制的原因,去掉这一限制后, 代码的可读性会好很多。现在,如果你的配置允许重复注解,你可以毫无顾虑地一次声明多个同一种类型的注解。 它目前还不是默认行为,你需要显式地要求进行重复注解。
创建一个重复注解
如果一个注解在设计之初就是可重复的,你可以直接使用它。但是,如果你提供的注解是为用户提供的, 那么就需要做一些工作,说明该注解可以重复。下面是你需要执行的两个步骤:
- 将注解标记为@Repeatable
- 提供一个注解的容器下面的例子展示了如何将@Basic注解修改为可重复注解
@Repeatable(Basics.class)
@interface Basic {
String name();
}
@Retention(RetentionPolicy.RUNTIME)
@interface Basics {
Basic[] value();
}
完成了这样的定义之后,Person类可以通过多个@Basic注解进行注释,如下所示:
@Basic(name="fix")
@Basic(name="todo")
class Person{ }
编译时, Person 会被认为使用了 @Basics( { @Basic(name=”fix”) , @Basic(name=”todo”)} ) 这样的形式进行了注解,所以,你可以把这种新的机制看成是一种语法糖, 它提供了程序员之前利用的惯用法类似的功能。为了确保与反射方法在行为上的一致性, 注解会被封装到一个容器中。 Java API中的getAnnotation(Class<T> annotationClass)方法会为注解元素返回类型为T的注解。 如果实际情况有多个类型为T的注解,该方法的返回到底是哪一个呢?
我们不希望一下子就陷入细节的魔咒,类Class提供了一个新的getAnnotationsByType方法, 它可以帮助我们更好地使用重复注解。比如,你可以像下面这样打印输出Person类的所有Basic注解:
返回一个由重复注解Basic组成的数组
public static void main(String[] args) {
Basic[] basics = Person.class.getAnnotationsByType(Basic.class);
Arrays.asList(basics).forEach(a -> {
System.out.println(a.name());
});
}
Null检查
Objects类添加了两个静态方法isNull和nonNull,在使用流的时候非常有用。
例如获取一个流的所有不为null的对象:
Stream.of("a", "c", null, "d")
.filter(Objects::nonNull)
.forEach(System.out::println);
Java 8 基础API的一些小的该进的更多相关文章
- java多线程基础API
本次内容主要讲认识Java中的多线程.线程的启动与中止.yield()和join.线程优先级和守护线程. 1.Java程序天生就是多线程的 一个Java程序从main()方法开始执行,然后按照既定的代 ...
- java - day009 - 基础API,object,String, StringBuilder/StringBuffer, 正则表达式
API java.lang.object object 所有类的顶层父类 一个类如果不继承其他类,默认继承object. toString() 获得一个对象的字符串表示 可以重写 ...
- 一个小栗子聊聊JAVA泛型基础
背景 周五本该是愉快的,可是今天花了一个早上查问题,为什么要花一个早上?我把原因总结为两点: 日志信息严重丢失,茫茫代码毫无头绪. 对泛型的认识不够,导致代码出现了BUG. 第一个原因可以通过以后编码 ...
- Java基础API
API API概述 API (Application Programming Interface) :应用程序编程接口 java中的API指的就是 JDK 中提供的各种功能的 Java类,这些类将底层 ...
- 【百度文库课程】Java语言基础与OOP入门学习笔记一
一. Java的历史与由来 原名Oak,针对嵌入式系统开发设计,语法与C/C++基本一致 二. Java语言特点 Java由四方面组成:Java编程语言.Java类文件格式.Java虚拟机和Java应 ...
- JAVA面试基础
JAVA相关基础知识1.面向对象的特征有哪些方面 ?1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂 ...
- Java 并发基础
Java 并发基础 标签 : Java基础 线程简述 线程是进程的执行部分,用来完成一定的任务; 线程拥有自己的堆栈,程序计数器和自己的局部变量,但不拥有系统资源, 他与其他线程共享父进程的共享资源及 ...
- 服务器编程入门(4)Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系. 这节主要介绍三个方面的内容:套接字( ...
- Java Web基础入门
前言 语言都是相通的,只要搞清楚概念后就可以编写代码了.而概念是需要学习成本的. Java基础 不用看<编程思想>,基础语法看 http://www.runoob.com/java/jav ...
随机推荐
- iOS 网络编程模式总结
IOS 可以采用三类api 接口进行网络编程,根据抽象层次从低到高分别为socket方式.stream方式.url 方式. 一 .socket 方式 IOS 提供的socket 方式的网络编程接口为C ...
- 避免"Physics Space Locked"错误
在一些cocos2d中使用物理引擎的代码中,往往会出现如下错误: Aborting due to Chipmunk error: You cannot manually reindex objects ...
- 色彩转换——RGB & HSI
RGB to HSI I=(R+G+B)/3; S=1-3*min(R,G,B)/(R+G+B); H = cos^(-1)((0.5*((R-G)+(R-B))) / ((R-G)^2 + (R-B ...
- windows下c语言获取程序当前的执行目录,读文件的代码片
代码如下: #include "stdafx.h" #include "stdlib.h" #include <direct.h> #include ...
- 【Android 应用开发】Android之Bluetooth编程
Android Bluetopth 编程大牛文章 http://my.oschina.net/u/994235/blog?catalog=313604 ViewGroup 相关资料 : http:// ...
- Java 去掉字符串中的换行符回车符等
去掉一个字符串中的换行符.回车符等,将连续多个空格替换成一个空格 String string = "this just a test" Pattern p = Pattern.co ...
- gcc如何生成预编译头文件(.gch)
1 建立comm.h 2 main.c中包含comm.h : #include "comm.h" 3 gcc -o comm.h.gch comm.h(低版本gcc会有bug) 4 ...
- Python 可视化TVTK CubeSource管线初使用
CubeSource对象是长方体数据源对象.本次在安装成功TVTK库的基础上显示一个长方体对象.通过以下代码,我们设置一个长宽高分别为1.0,2.0,3.0的长方体数据源并通过管线显示出来. from ...
- Ubuntu18.04教程
pre.ctl { font-family: "Liberation Mono", monospace } h1 { margin-bottom: 0.21cm } h1.west ...
- MyBatis 框架之快速入门程序
一.使用 IDEA 快速创建 Maven 项目 关于如何快速创建 Maven 项目,这个可以参考下面这篇文章: Maven 项目管理工具基础入门系列(一) 二.快速配置 MyBatis 依赖 jar ...