Android Studio下使用Java 8 ——让你的代码更优雅

来源:互联网 发布:mui.pulltorefresh.js 编辑:程序博客网 时间:2024/06/09 23:05

1、foreach遍历

1.1 遍历map

在java 8之前,我们 遍历 map一般都是:

Map<String, Integer> items = new HashMap<>();items.put("A", 10);items.put("B", 20);items.put("C", 30);items.put("D", 40);items.put("E", 50);items.put("F", 60);for (Map.Entry<String, Integer> entry : items.entrySet()) {    System.out.println("Item : " + entry.getKey() + " Count : " + entry.getValue());}

而在java 8中,你可以这样:

Map<String, Integer> items = new HashMap<>();items.put("A", 10);items.put("B", 20);items.put("C", 30);items.put("D", 40);items.put("E", 50);items.put("F", 60);items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));items.forEach((k,v)->{    System.out.println("Item : " + k + " Count : " + v);    if("E".equals(k)){        System.out.println("Hello E");    }});

*注意:
将此代码直接 放进android studio中会报错,并不是代码本身的问题,而是gradle配置的问题。
在Android Studio中,即使你的项目jdk默认是1.8,也会报错:

Error: Jack is required to support java 8 language features. Either enable Jack or remove sourceCompatibility JavaVersion.VERSION_1_8.

错误:Jack需要支持java 8语言功能。 启用Jack或删除sourceCompatibility JavaVersion.VERSION_1_8。

解决办法:
项目gradle中

android {    compileSdkVersion 24    defaultConfig {        ···        jackOptions {            enabled true        }    }    buildTypes {        ···    }    buildToolsVersion '25.0.0'    compileOptions {        **sourceCompatibility JavaVersion.VERSION_1_8        targetCompatibility JavaVersion.VERSION_1_8**    }}dependencies {    ···}

如此配置即可。

1.2 遍历list

java 8之前:

List<String> items = new ArrayList<>();items.add("A");items.add("B");items.add("C");items.add("D");items.add("E");for(String item : items){    System.out.println(item);}

java 8: foreach + 拉姆达表达式 或者 method reference(方法引用)

List<String> items = new ArrayList<>();items.add("A");items.add("B");items.add("C");items.add("D");items.add("E");//lambda//Output : A,B,C,D,Eitems.forEach(item->System.out.println(item));//Output : Citems.forEach(item->{    if("C".equals(item)){        System.out.println(item);    }});//method reference//Output : A,B,C,D,Eitems.forEach(System.out::println);//Stream and filter//Output : Bitems.stream()    .filter(s->s.contains("B"))    .forEach(System.out::println);

2、java 8 stream

Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。

java 8之前的 取值、排序:

List<Transaction> groceryTransactions = new Arraylist<>();for(Transaction t: transactions){    if(t.getType() == Transaction.GROCERY){        groceryTransactions.add(t);    }}Collections.sort(groceryTransactions, new Comparator(){    public int compare(Transaction t1, Transaction t2){        return t2.getValue().compareTo(t1.getValue());    }});List<Integer> transactionIds = new ArrayList<>();for(Transaction t: groceryTransactions){    transactionsIds.add(t.getId());}

java 8:

 List<Integer> transactionsIds = transactions.parallelStream(). filter(t -> t.getType() == Transaction.GROCERY). sorted(comparing(Transaction::getValue).reversed()). map(Transaction::getId). collect(toList());
阅读全文
1 0