文档章节

2017 年最流行、最好用的 Java 库

ssnoodles
 ssnoodles
发布于 2017/02/24 14:45
字数 1707
阅读 129
收藏 2
点赞 0
评论 0

原文地址:

http://mp.weixin.qq.com/s?__biz=MzI1OTIyNzY3Mw==&mid=2247483753&idx=1&sn=2f9b1aa8f29436e6d2d1dabb1066d3f7&chksm=ea7d681fdd0ae109ff6cb218ab13700fd3764fd385fc692a6ca8418d687bb59fe9d292303517&mpshare=1&scene=23&srcid=0224J82AJOyRvpBg9HLPvckX#rd

文章介绍

这篇文章介绍了2017 年最流行、最好用的 Java 库,从事 Java 或 Android 开发的同学不要错过了。

正文

Guice

Guice (发音同 juice) 是 Google 开发的一款适用于 Java 6+ 的依赖注入框架。

# 依赖注入方式public class DatabaseTransactionLogProvider implements Provider<TransactionLog> {  @Inject Connection connection;  public TransactionLog get() {    return new DatabaseTransactionLog(connection);
  }
}
# FactoryModuleBuilder generates factory using your interfacepublic interface PaymentFactory {   Payment create(Date startDate, Money amount);
}
GitHub:https://github.com/google/guice
JavaDoc: https://google.github.io/guice/api-docs/latest/javadoc/index.html
网址:https://github.com/google/guice/wiki/Motivation
FactoryModuleBuilder:https://google.github.io/guice/api-docs/latest/javadoc/index.html

 

 

OkHttp

OkHttp 是目前非常流行的网络请求框架。高效地执行 Http 请求能够让你的数据加载更快、带宽消耗更少。

OkHttp 的高效率来自以下几个特性:

支持 HTTP/2;这允许所有对相同 host 的请求共用一个 socket;
如果还没有升级到 HTTP/2,OkHttp 内部的请求池也能减少你的请求延时;
GZIP 能压缩数据下载体积;
对 Response 进行自动 cache 可以加快重复请求的响应速度
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();
}
GitHub:https://github.com/square/okhttp
网址:http://square.github.io/okhttp/

 

Retrofit

这是一款 Square 公司开发的针对 Android 和 Java 的类型安全 Http Client。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);
利用这个接口,我们可以向远程服务器直接执行同步或异步的 Http Request。

Call<List<Repo>> repos = service.listRepos("octocat");
GitHub:https://github.com/square/retrofit
网址:http://square.github.io/retrofit/

 

JDeferred

这是一款类似 JQuery 的 Java Deferred/Promise 库,具备如下特性:

Deferred object and Promise
Promise 回调: .then(…), .done(…), .fail(…), .progress(…), .always(…)
Multiple promises: .when(p1, p2, p3, …).then(…)
Callable 和 Runnable: wrappers.when(new Runnable() {…})
使用 Executor Service
Java 范型支持: Deferred, deferred.resolve(10);, deferred.reject(new Exception());,deferred.notify(0.80);,
Android支持
Java 8 Lambda 友好

GitHub:https://github.com/jdeferred/jdeferred

网址:http://jdeferred.org/

 

RxJava

RxJava – JVM 的响应式扩展 – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.

它在观察者模式的基础上进行了扩展,支持 data/events 的序列化,增加了多种操作符来组装数据序列,而且,你完全不用关心底层的线程切换、同步机制、线程安全及并发数据结构。

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
GitHub:https://github.com/ReactiveX/RxJava
Wiki:https://github.com/ReactiveX/RxJava/wiki

 

MBassador

MBassador 是一款基于发布-订阅模式的轻量级、高性能的事件总线。它使用起来非常简便,功能丰富,而且可以自扩展来进一步提高性能、减少资源开销。

MBassador 高性能的最关键原因在于一种特殊的数据结构,这种数据结构可最大限度减小锁竞争。

基于注解
同步/异步事件发布
可配置引用类型
事件过滤
事件包裹
Handler优先级
自定义错误处理
扩展性
// Define your listener
class SimpleFileListener{
    [@Handler](https://my.oschina.net/u/994780)
    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();
网址:https://github.com/bennidi/mbassador
Javadoc:http://bennidi.github.io/mbassador/

 

Project Lombok

使用注解 annotation 来减少代码重复,例如 getter、setter、not null检查、生成 Builder 等。下面有一些 Project Lombok 的 feature:

val - 自动解析变量的返回类型,并且该变量是 final 类,如 final String foo = example.get(0); var foo = example.get(0);
[@NonNull](https://my.oschina.net/u/2981441) - 自动 check 非空并抛异常;
@Cleanup - 自动关闭资源,调用 close() 方法;
@Getter / @Setter - 不用再写 public int getFoo() {return foo;} 了;
@ToString - 不用再开启 Debugger 来看某个值了,它能自动生成一个 toString 方法;
@EqualsAndHashCode - 更方便地比较两个对象是否相等;
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor - 自动按顺序生成构造函数;
@Data - 同时包括 @ToString, @EqualsAndHashCode, @Getter 对所有变量, @Setter 对所有非 final 变量, @RequiredArgsConstructor

GitHub:https://github.com/rzwitserloot/lombok

网址:https://projectlombok.org/

 

Simple Logging Facade for Java (SLF4J)

The Simple Logging Facade for Java (SLF4J) 是一个日志库抽象层,并非真正的日志库,可以支持不同的日志实现,如java.util.logging, logback, log4j。开发者可以利用这个抽象层来随时切换底层日志实现框架。

实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。

那么什么时候使用SLF4J比较合适呢?

如果你开发的是类库或者嵌入式组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。在另一方面,如果是一个简单或者独立的应用,确定只有一种日志系统,那么就没有使用SLF4J的必要。假设你打算将你使用log4j的产品卖给要求使用JDK 1.4 Logging的用户时,面对成千上万的log4j调用的修改,相信这绝对不是一件轻松的事情。但是如果开始便使用SLF4J,那么这种转换将是非常轻松的事情。

网址:http://www.slf4j.org/
GitHub:https://github.com/qos-ch/slf4j
FAQ:https://www.slf4j.org/faq.html

 

JUnitParams

@Test
@Parameters({"17, false", 
             "22, true" })
public void personIsAdult(int age, boolean valid) throws Exception {
    assertThat(new Person(age).isAdult(), is(valid));
}
它的优势如下:

更加明显 - 参数直接放在 test method 里,而非 class 里
更加简洁 - 不需要构造函数来设置参数
参数可以通过 csv String 或 parameters provider class 来提供

网址:http://pragmatists.github.io/JUnitParams

GitHub:https://github.com/Pragmatists/JUnitParams
Quickstart:https://github.com/Pragmatists/junitparams/wiki/Quickstart
Mockito

Tasty mocking framework for unit tests in Java

 //You can mock concrete classes, not just interfaces
 LinkedList mockedList = mock(LinkedList.class);

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

 //following prints "first"
 System.out.println(mockedList.get(0));

 //following throws runtime exception
 System.out.println(mockedList.get(1));

 //following prints "null" because get(999) was not stubbed
 System.out.println(mockedList.get(999));

 //Although it is possible to verify a stubbed invocation, usually it's just redundant
 //If your code cares what get(0) returns, then something else breaks (often even before verify() gets executed).
 //If your code doesn't care what get(0) returns, then it should not be stubbed. Not convinced? See here.
 verify(mockedList).get(0);
网址:http://site.mockito.org/
GitHub:https://github.com/mockito/mockito
文档:http://static.javadoc.io/org.mockito/mockito-core/2.7.9/org/mockito/Mockito.html)

© 著作权归作者所有

共有 人打赏支持
ssnoodles
粉丝 1
博文 31
码字总数 9574
作品 0
张家港
TIOBE和PYPL的5月编程语言排行榜:如果你只能学习一门语言,Python是最好的选择!...

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 图片来源:Avengers: Infinity War 近日,TIOBE编程语言社区发布了 2018年 5月排行榜,Java、C、C ++ 三门编...

csdnsevenn ⋅ 05/10 ⋅ 0

Java 的 Ruby 解释器 - JRuby

JRuby是面向Ruby、基于Java虚拟机(JVM)的一种解释程序,它结合了Ruby语言的简易性和功能强大的JVM的执行机制,包括与Java库 全面集成。Rails彻底加快及简化了Web应用的开发,不过它让人觉得不...

匿名 ⋅ 2008/09/07 ⋅ 2

JRuby 9.1.17.0 发布,改进对 Java 9/10 的兼容性

JRuby 9.1.17.0 已发布,JRuby 是面向 Ruby、基于 Java 虚拟机(JVM)的一种解释程序,它结合了 Ruby 语言的简易性和功能强大的 JVM 的执行机制,包括与 Java 库全面集成。Rails 彻底加快及简化...

王练 ⋅ 04/24 ⋅ 0

怎样实现基于Trie树和字典的分词功能

前言 目前做分词比较流行的是用深度学习来做,比如用循环神经网络和条件随机场,也有直接用条件随机场或隐马尔科夫模型的。前面也实现过上面几种,效果挺不错,基于隐马尔科夫模型的差一点,...

超人汪小建 ⋅ 06/06 ⋅ 0

为什么Scala能进入TIOBE发布的5月编程语言榜单中?

     首先简单介绍一下Scala语言。Scala创建于2003年,专门用来解决Java程序员所遇到的一系列问题的,比如代码冗长,性能差。它能够进入到TIOBE刚刚发布的编程语言榜单的原因是它的优势和...

张旭乾 ⋅ 05/07 ⋅ 0

一图简看基于搜索的问答机器人设计

前言 对于 chatbot,现在学界更流行的实现方式是基于深度学习和强化学习,比如seq2seq模型,具体可参考前面的文章《深度学习的seq2seq模型》。 而对于工业界,直接用 seq2seq 模型来实现端对...

超人汪小建 ⋅ 05/22 ⋅ 0

尘埃落定,JDK 11 确定将引入 Shebang #! 符号

按计划,JDK 11 将于 9 月发布。随着时间的临近,越来越多的 JEP 正被不断被添加至 JDK 11 的开发列表中。 2017 年 12 月 1 日,来自 Oracle 的开发者 Jonathan Gibbons 创建了 JEP 330 草案...

王练 ⋅ 06/04 ⋅ 3

和Google的Java版权案里,Oracle真就那样遭人恨吗?

作者 | Vasiliy Zukanov 编辑 | 无明 3 月底,聊聊架构报道了 Oracle 与 Google 官司的最新进展,美国联邦巡回法院裁定,谷歌在 Android 上使用了大量 Java 代码,侵犯了 Oracle 的版权。版权...

聊聊架构 ⋅ 05/05 ⋅ 0

高手问答第 197 期 —— Kotiln “上位”一周年,Kotlin 问答专场等你提问!

OSCHINA 本期高手问答(2018 年 5 月 15 日 — 5 月 21 日)我们邀请到了欧阳燊老师@ouyangshen 和大家一起探讨有关 Kotlin 开发的问题。 Kotlin 诞生于 2011 年,作为后起之秀的它虽然拥有代码...

局长 ⋅ 05/14 ⋅ 0

学好Java只需要做到这7点,年薪20W很简单~

大道至简,所以扎实有用的方法,其实都是很简单的,难在踏踏实实的执行过程。今天为大家介绍的就是Java学习的7个看起来非常简单的方法,快学起来吧。 为什么要学习java? Java是目前最流行的...

欧阳海阳 ⋅ 06/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

骰子游戏代码开源地址

因为阿里云现在服务器已经停用了,所以上面的配置已经失效。 服务端开源地址:https://gitee.com/goalya/chat4.git 客户端开源地址:https://gitee.com/goalya/client4.git 具体运行界面请参考...

算法之名 ⋅ 30分钟前 ⋅ 0

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部