大数据培训新三板挂牌机构 股票代码:837906 | EN CN
Java是什么?
Java历史
Java语言特点
C++ VS Java比较
Java工厂设计模式
Java抽象工厂模式
Java单例模式
Java建造者(Builder)模式
Java原型模式
Java适配器模式
Java桥接模式
Java获取网络文件大小
Java套接字到单一的客户端
Java连接套接字
Java URL部分
Java URL连接日期
Java下载网页
Java主机指定IP地址
Java确定本地IP地址
Java检查端口占用
Java查找代理服务器设置
Java创建Socket
Java线程实例
Java检查线程活着
Java如何检查一个线程停止或没有?
Java解决死锁实例
Java如何获取正在运行的线程的优先级?
Java如何监视线程的状态?
Java获取线程名称
Java线程生产者消费者问题
Java如何设置线程的优先级?
Java如何停止线程一会儿?
Java如何暂停线程?
Java获取线程ID
Java如何检查线程的优先级?
Java显示所有正在运行的线程?
Java显示线程状态
Java中断一个线程
Java Applet实例
Java创建Applet
Java使用Applet创建横幅
Java使用Applet显示时钟?
Java在一个Applet创建不同形状
Java如何使用Applet填充形状的颜色?
Java使用Applet跳转到一个链接
Java在Applet创建事件监听器
Java使用Applet显示图像
Java使用Applet在新窗口中打开链接
Java使用Applet播放声音?
Java使用Applet读取文件
Java使用Applet写入文件
Java中Swing应用程序applet
Java简单的图形用户界面-GUI
Java以不同的字体显示文本
Java使用GUI画一条线
Java创建框架-frame
Java使用GUI显示多边形
Java在矩形中显示文本
Java GUI显示不同形状
Java如何绘制GUI实心矩形?
Java创建GUI透明光标
Java检查GUI平滑处理状态
Java在框架中显示颜色
Java GUI显示饼图
Java使用图形用户界面绘制文本
Java编辑表-table
Java 使用prepared语句
Java使用保存点和回滚
Java同时执行数据库多个SQL命令
Java使用行方法
Java使用列方法
Java正则表达式实例
Java将字符串分割
Java搜索重复单词
Java查找出现的单词
Java最后一个词的索引
Java模式匹配
Java删除空格
Java匹配电话号码
Java计数组词
Java搜索词组
Java拆分正则表达式
Java替换第一个出现字符串
Java检查日期格式
Java验证电子邮件地址格式
Java替换所有匹配字符串
Java使每个单词的第一个字母大写
从XML创建SqlSessionFactory实例
不使用XML来创建SqlSessionFactory
从SqlSessionFactory获取SqlSession
映射SQL语句
作用域和生命周期
Mapper XML配置
properties元素
Settings元素
typeAliases 元素
typeHandlers元素
理解CacheLine与写出更好的JAVA
Java核心技术点之动态代理
更好的使用JAVA线程池
理解Java中字符流与字节流的区别
深入分析Java方法反射的实现原理
关于Java面试,你应该准备这些知识点
Java内存模型
2017年你不能错过的Java类库
Leakcanary Square的一款Android/Java内存泄漏检测工具
Java Synchronised机制
Java核心技术点之注解
JVM(8):JVM知识点总览-高级Java工程师面试必备
JVM(3):Java GC算法 垃圾收集器
JVM(1):Java 类的加载机制
解决ActiveMQ中,Java与C++交互中文乱码问题
关于Java Collections的几个常见问题
Java I/O 总结
JVM源码分析之Java对象的创建过程
JVM源码分析之Java类的加载过程
Java GC的那些事(下)
Java GC的那些事(上)
java对象头的HotSpot实现分析
面试的角度诠释Java工程师(一)
面试的角度诠释Java工程师(二)
框架开发之Java注解的妙用
谈谈Java反射机制
Java并发:volatile内存可见性和指令重排
死磕Java并发:Java内存模型之happens-before
死磕Java并发:深入分析volatile的实现原理
死磕Java并发:深入分析synchronized的实现原理
Java 10 可能对 Lambda 表达式进行升级
G1垃圾回收器中的字符串去重(Java 8 Update 20)
Java RESTful框架的性能比较
理解RxJava的线程模型
继续了解Java的纤程库 – Quasar
Java中的纤程库 – Quasar
Java豆瓣电影爬虫——抓取电影详情和电影短评数据
Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap
Java Lambda表达式初探
Java中的陷阱题
Java 9的这一基本功能,你可能从未听过
关于Java并发编程的总结和思考
几种简单的负载均衡算法及其Java代码实现
JAVA虚拟机关闭钩子(Shutdown Hook)
Java 脚本化编程指南
Java Scripting API 使用示例
Java 8 的 Nashorn 脚本引擎教程
如何开始使用 Java 机器学习
CognitiveJ —— Java 的图像分析库
Java 性能优化的五大技巧
Java 解惑:Comparable 和 Comparator 的区别
Google Java编程风格指南
java NIO详解
Java 异常处理的误区和经验总结
Java语法糖(4):内部类
Java语法糖(3):泛型
Java语法糖(2):自动装箱和自动拆箱
Java消息队列任务的平滑关闭
Java语法糖(1):可变长度参数以及foreach循环原理
2016最流行的Java EE服务器
自己写一个java.lang.reflect.Proxy代理的实现
java 如何在pdf中生成表格
如何防止单例模式被JAVA反射攻击
java虚拟机 jvm 局部变量表实战
聊聊并发-Java中的Copy-On-Write容器
java.lang.Instrument 代理Agent使用
Java开发者需要了解的移动开发编程语言
13个不容错过的Java项目
2016年7款最佳 Java 框架推荐
Java 开发者值得关注的 11 个技术博客
Redmonk发布Java框架流行度调研结果
Java 8开发的4大顶级技巧
GitHub漫游指南:10个值得你关注的Java项目
除了Guava,Java开发者还值得了解的5个谷歌类库
Java中创建对象的5种不同方法
Java性能优化全攻略
奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?
11个最值得Java开发者收藏的网站
Java的常见误区与细节
对Java意义重大的7个性能指标
Java调优经验谈
关于Java并发编程的总结和思考
HDFS Federation设计动机与基本原理
《Effective STL》学习笔记(第三部分)
《Effective STL》学习笔记(第二部分)
《Effective STL》学习笔记(第一部分)
数据结构之位图
Thrift使用指南
Cassandra概要介绍
Cassandra部署与安装
Cassandra客户端
Cassandra数据模型
Cassandra中的各种策略
数据结构之树状数组
数据结构之伸展树
数据结构之后缀数组
数据结构之堆
浅析MRv1与MRv2的API兼容性
Apache Tez最新进展
运行在YARN上的计算框架
从传统操作系统角度理解Hadoop YARN

2017年你不能错过的Java类库

于2017-05-10由小牛君创建

分享到:


这篇文章是在我看过 Andres Almiray 的一篇介绍文后,整理出来的。因为内容非常好,我便将它整理成参考列表分享给大家, 同时附上各个库的特性简介和示例。

请欣赏!

Guice

Guice (发音同 ‘juice’) ,是一个 Google 开发的轻量级依赖性注入框架,适合 Java 6 以上的版本。

# Typical dependency injection
public class DatabaseTransactionLogProvider implements Provider<TransactionLog> {
  @Inject Connection connection;

  public TransactionLog get() {
    return new DatabaseTransactionLog(connection);
  }
}
# FactoryModuleBuilder generates factory using your interface
public interface PaymentFactory {
   Payment create(Date startDate, Money amount);
 }
 GitHubJavaDoc使用指南FactoryModuleBuilder

OkHttp

HTTP是现代应用程序实现网络连接的途径,也是我们进行数据和媒体交换的工具。高效使用HTTP能使你的东西加载更快,并节省带宽。

OkHttp是一个非常高效的HTTP客户端,默认情况下:

  • 支持HTTP/2,允许对同一主机的请求共用一个套接字。
  • 如果HTTP/2 不可用,连接池会减少请求延迟。
  • 透明的GZIP可以减少下载流量。
  • 响应的缓存避免了重复的网络请求。
OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  Response response = client.newCall(request).execute();
  return response.body().string();
}
GitHubWebsite

Retrofit

Retrofit 是 Square 下的类型安全的 HTTP 客户端,支持 Android 和 Java 等,它能将你的 HTTP API 转换为 Java 接口。

Retrofit 将 HTTP API 转换为 Java 接口:

public interface GitHubService {
    @GET("users/{user}/repos")
    Call<List<Repo>listRepos(@Path("user") String user);
}
Retrofit 类实现 GitHubService 接口:
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();

GitHubService service = retrofit.create(GitHubService.class);
来自 GitHubService 的每个 Call 都能产生为远程 Web 服务产生一个异步或同步 HTTP 请求:
Call<List<Repo>> repos = service.listRepos("octocat");
GitHubWebsite

JDeferred

与JQuery类似的Java Deferred/Promise类库

  • Deferred 对象和 Promise
  • Promise 回调:.then(…).done(…).fail(…).progress(…).always(…)
  • 支持多个promises - .when(p1, p2, p3, …).then(…)
  • Callable 和 Runnable - wrappers.when(new Runnable() {…})
  • 使用 Executor 服务
  • 支持Java 泛型: Deferred<Integer, Exception, Doubledeferred;deferred.resolve(10);deferred.reject(new Exception());,deferred.notify(0.80);,
  • 支持Android
  • Java 8 Lambda的友好支持

GitHu链接官方网站链接

RxJava

RxJava – JVM的响应式编程扩展 – 是一个为Java虚拟机编写的使用可观察序列的构建异步的基于事件的程序的类库。

它基于观察者模式实现对数据/事件的序列的支持,并添加了一些操作符,允许你以声明式构建序列, 使得开发者无需关心底层的线程、同步、线程安全和并发数据结构。

RxJava最常见的一个用法就是在后台线程运行一些计算和网络请求,而在UI线程显示结果(或者错误):

Flowable.fromCallable(() -{
     Thread.sleep(1000); //  imitate expensive computation
     return "Done";
 })
   .subscribeOn(Schedulers.io())
   .observeOn(Schedulers.single())
   .subscribe(System.out::println, Throwable::printStackTrace);

 Thread.sleep(2000); // <--- wait for the flow to finish
GitHubWiki

MBassador

MBassador是一个实现了发布-订阅模式的轻量级的,高性能的事件总线。它易于使用,并力求功能丰富,易于扩展,而同时又保证资源的高效利用和高性能。

MBassador的高性能的核心是一个专业的数据结构,它提供了非阻塞的读取器,并最小化写入器的锁争用,因此并发读写访问的性能衰减会是最小的。

  • 注解驱动的
  • 提供任何东西,慎重对待类型层次结构
  • 同步和异步的消息传递
  • 可配置的引用类型
  • 消息过滤
  • 封装的消息
  • 处理器的优先级
  • 自定义错误处理
  • 可扩展性
// Define your listener
class SimpleFileListener{
    @Handler
    public void handle(File msg){
      // do something with the file
    }
}

// somewhere else in your code
MBassador bus = new MBassador();
Object listener = new SimpleFileListener();
bus.subscribe (listener);
bus.post(new File("/tmp/smallfile.csv")).now();
bus.post(new File("/tmp/bigfile.csv")).asynchronously();
GitHubJavadoc

Lombok项目

使用注解来减少Java中的重复代码,比如getter,setters,非空检查,生成的Builder等。

  • val - 总算有了!无忧的final本地变量。
  • @NonNull - 或:我如何学会不再担心并爱上了非空异常(NullPointerException)。
  • @Cleanup - 自动的资源管理:安全调用你的close() 方法,无需任何麻烦。
  • @Getter / @Setter - 再也不用写 public int getFoo() {return foo;}了
  • @ToString - 无需启动调试器来检查你的字段:就让Lombok来为你生成一个toString方法吧!
  • @EqualsAndHashCode - 实现相等的判断变得容易了:它会从你的对象的字段里为你生成hashCode和equals方法的实现。
  • @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor - 定做构造函数:为你生成各种各样的构造函数,包括无参的,每一个final或非空的字段作为一个参数的,或者每一个字段都作为参数的。
  • @Data - 所有的都同时生成:这是一个快捷方式,可以为所有字段生成@ToString@EqualsAndHashCode@Getter注解,以及为所有非final的字段生成@Setter注解,以及生成@RequiredArgsConstructor!
  • @Value - 声明一个不可变类变得非常容易。
  • @Builder - … 而且鲍伯是你叔叔:创建对象的无争议且奢华的接口!
  • @SneakyThrows - 在以前没有人抛出检查型异常的地方大胆的抛出吧!
  • @Synchronized - 正确的实现同步:不要暴露你的锁。
  • @Getter(lazy=true) 懒惰是一种美德!
  • @Log - 船长日志,星历24435.7: “那一行又是什么呢?”

GitHubWebsite

Java简单日志门面(SLF4J)

Java简单日志门面 (SLF4J) 为不同的日志框架(比如java.util.logginglogbacklog4j)提供了简单的门面或者抽象的实现,允许最终用户在部署时能够接入自己想要使用的日志框架。

简言之,类库和其他嵌入式的组件都应该考虑采用SLF4J作为他们的日志需求,因为类库无法将它们对日志框架的选择强加给最终用户。另一方面,对于独立的应用来说,就不一定需要使用SLF4J。独立应用可以直接调用他们自己选择的日志框架。而对于logback来说,这个问题是没有意义的,因为logback是通过SLF4J来暴露其日志接口的。

WebsiteGitHubFAQ

JUnitParams

对测试进行参数化,还不错

    @Test
       @Parameters({"17, false", 
                    "22, true" })
       public void personIsAdult(int age, boolean valid) throws Exception {
         assertThat(new Person(age).isAdult(), is(valid));
       }
与标准的JUnit 参数化运行器的区别如下:

  • 更明确 – 参数实在测试方法的参数中,而不是在类的字段中
  • 更少的代码 – 你不需要用构造函数来设置参数
  • 你可以在同一个类混合使用参数化和非参数化的方法。
  • 参数可以通过一个CSV字符串或者一个参数提供类传入。
  • 参数提供类可以拥有尽可能多的参数提供方法,这样你可以给不同的用例进行分类。
  • 你可以拥有可以提供参数的测试方法 (再也不需要外部类或者静态类了)
  • 你可以在你的集成开发工具中看到实际的参数值(而在JUnit的Parametrised里,只有连续数目的参数)

官方网站GitHub快速入门

Mockito

Java里单元测试的非常棒(tasty)的模拟框架:

 //你可以模拟具体的类,而不只是接口
 LinkedList mockedList = mock(LinkedList.class);

 //打桩
 when(mockedList.get(0)).thenReturn("first");
 when(mockedList.get(1)).thenThrow(new RuntimeException());

 //以下代码打印出"first"字符串
 System.out.println(mockedList.get(0));

 //以下代码抛出运行时异
 System.out.println(mockedList.get(1));

 //以下代码打印出"null",因为get(999)没有被打桩
 System.out.println(mockedList.get(999));

 //尽管是可以验证一个打过桩的调用,但通常是多余的
 //如果你的代码关心get(0)返回值的内容,那么其他东西就会中断(往往在verify()执行之前就发生了)。
 //如果你的代码不关心get(0)返回值的内容,那么它就不应该被打桩。不相信吗?看看这里。
 verify(mockedList).get(0);
官方网站, GitHub, 文档

Jukito

它结合了JUnit、Guice和Mockito的能力。 而且它还听起来像一门很酷的武术。

  • 极大的减少了诸如自动mock的样板,从而使测试更加易读。
  • 可以使得测试能够根据被测试的对象上的API的改变而弹性变化。
  • 标有@Inject注解的字段会被自动注入,不需要担心会遗忘掉它们
  • 使得将对象连接在一起变得容易,因此你可以将一个单元测试变成集成测试的一部分
@RunWith(JukitoRunner.class)
public class EmailSystemTest {

  @Inject EmailSystemImpl emailSystem;
  Email dummyEmail;

  @Before
  public void setupMocks(
      IncomingEmails incomingEmails,
      EmailFactory factory) {
    dummyEmail = factory.createDummy();
    when(incomingEmails.count()).thenReturn(1);
    when(incomingEmails.get(0)).thenReturn(dummyEmail);
  }

  @Test
  public void shouldFetchEmailWhenStarting(
      EmailView emailView) {
    // WHEN
    emailSystem.start();

    // THEN
    verify(emailView).addEmail(dummyEmail);
  }
}
GitHubWebsite

Awaitility

Awaitility是一个小型的Java领域专用语言(DSL),用于对异步的操作进行同步。

测试异步的系统是比较困难的。不仅需要处理线程、超时和并发问题,而且测试代码的本来意图也有可能被这些细节所蒙蔽。Awaitility是一个领域专用语言,可以允许你以一种简洁且易读的方式来表达异步系统的各种期望结果。

@Test
public void updatesCustomerStatus() throws Exception {
    // Publish an asynchronous event:
    publishEvent(updateCustomerStatusEvent);
    // Awaitility lets you wait until the asynchronous operation completes:
    await().atMost(5, SECONDS).until(customerStatusIsUpdated());
    ...
}
GitHub入门, 用户指南

Spock

企业级的测试和规范框架。

class HelloSpockSpec extends spock.lang.Specification {
  def "length of Spock's and his friends' names"() {
    expect:
    name.size() == length

    where:
    name     | length
    "Spock"  | 5
    "Kirk"   | 4
    "Scotty" | 6
  }
}
GitHubWebsite

WireMock

用于模拟HTTP服务的工具

  • 对HTTP响应进行打桩,可以匹配URL、header头信息和body内容的模式
  • 请求验证
  • 在单元测试里运行,但是是作为一个对立的进程或者一个WAR应用的形式
  • 可通过流畅的Java API、JSON文件和基于HTTP的JSON进行配置
  • 对stub的录制/回放
  • 故障注入
  • 针对每个请求的根据条件进行代理
  • 针对请求的检查和替换进行浏览器的代理
  • 有状态的行为模拟
  • 可配置的响应延迟
{
    "request": {
        "method": "GET",
        "url": "/some/thing"
    },
    "response": {
        "status": 200,
        "statusMessage": "Everything was just fine!"
    }
}
GitHubWebsite