1. 函数式编程,因为在并发和时间驱动编程中的优势,函数式编程又逐渐流行起来

以前是实现一个比较器需要实现Comparator接口,并重写compare方法,以下为两种实现方法(类似还有线程,事件等):

    class compOldClass implements Comparator<String> {
@Override
public int compare(String first, String second) {
return Integer.compare(first.length(), second.length());
}
}
        Comparator<String> compOld = new Comparator<String>() {
@Override
public int compare(String first, String second) {
return Integer.compare(first.length(), second.length());
}
};

在JDK8中,很多接口添加@FunctionalInterface被声明为函数式接口,JDK8的接口中可以有default和static方法,函数式接口中除了覆盖Object的方法之外,只允许有一个抽象方法

@FunctionalInterface
public interface Comparator<T> {
......
int compare(T o1, T o2);
boolean equals(Object obj);
......
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
......
......
public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {
return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;
}
......
}

JDK8函数方式的Comparator实现

Comparator<String> comp = (first, second) -> Integer.compare(first.length(), second.length());

自定义测试:就是迭代元素,提供处理方法,进行处理

    @FunctionalInterface
interface WorkerSep {
public void doSthSep(String conent);
}
        com.timer.WorkerSep workerSep = (x) -> System.out.println(x);
List<String> lists = new ArrayList<String>();
lists.add("a");
lists.add("b");
lists.stream().forEach(workerSep::doSthSep);

方法引用(对象::实例方法 / 类::静态方法 / 类::实例方法 / 类::new (支持多个构造器根据参数选择最合适的)):例为调用父类方法,传入线程中执行

/**
* Created by itworker365 on 5/19/2017.
*/
public class Java8ThreadTest {
public static void main (String[] args) {
ConcurrentWorker concurrentWorker = new ConcurrentWorker();
concurrentWorker.doSth();
}
}
class Worker {
public void doSth() {
System.out.print("working......");
}
}
class ConcurrentWorker extends Worker {
public void doSth () {
Thread thread = new Thread(super::doSth);
thread.start();
}
}

2. Stream

例,读文件 拆分字符 打印 , 流处理的时候原字符不变,将输入流处理后传到下一个流处理器直到结束,输出的新字符为处理过后的,换成parallelStream就是并行的了,代码流程为创建一个stream,执行一些列操作,使用一个终止符来终止操作,但执行顺序为print被调用的时候,采取找数据,开始计算。

Collection接口中添加stream方法,可以将任何一个集合转换为stream,即使数组也可以Stream.of(数组),Stream.generate(),Stream.iterator(),Pattern.compile(正则).splistAsStream("****"),Files.lines(path)等

        String content = new String(Files.readAllBytes(Paths.get("d:\\a.txt")));
List<String> words = Arrays.asList(content.split(","));
//过滤掉fileter中运算为false的
words.stream().filter(w -> w.startsWith("b")).forEach(System.out::println);
//每行都执行以下map里的函数
words.stream().map(String::toUpperCase).map(s -> s.charAt(0)).forEach(System.out::println);
//不停输入,直到Limit,skip表示忽略掉前n个元素
Stream.iterate(1, item -> item + 1).limit(10).forEach(System.out::println);
//将每一行拆分为一个流添加到原来computer,it-worker ==》computer it worker
words.stream().flatMap(article -> Stream.of(article.split("-"))).forEach(System.out::println);
//perk显示元素是否被取用,count统计个数,同时局和方法还有max,min,findFirst,findAny,anyMatch等
words.stream().peek(System.out::println).count();
//有状态的转换,排序和去重等操作,需要记录元素状态,进行操作
words.stream().distinct().forEach(System.out::println);
//判断是否存在符合条件的元素optional元素还可以ifPresent,map,orElse等添加处理
Optional<String> optional = words.stream().filter(w -> w.startsWith("c")).findAny();
if (optional.isPresent()) {
System.out.println("option result: " + optional.get());
}
System.out.println("any match: " + words.stream().anyMatch(w -> w.startsWith("c")));
//将stream转为数组
String[] wordArray = words.stream().toArray(String[]::new);
//其他收集方式,其他方式类似,需要时查看API
Set<String> hashSet = words.stream().collect(Collectors.toSet());
List<String> list = words.stream().collect(Collectors.toList());
TreeSet<String> treeSet = words.stream().collect(Collectors.toCollection(TreeSet<String>::new));
Map<String,String> map = words.stream().collect(Collectors.toMap(x -> x, String::toUpperCase));
String result = words.stream().collect(Collectors.joining("/"));
//分组分片 same as String::toUpperCase
Map<String, List<String>> splitMap = words.stream().collect(Collectors.groupingBy(x -> x.toUpperCase()));
Map<Boolean, List<String>> partitionMap = words.stream().collect(Collectors.partitioningBy(x -> x.toUpperCase().equals("CD")));
//所有字符串concat在一起
String s = words.stream().reduce("", (a, b) -> a.concat(b));
System.out.println("reduce : " + s);

3.日期函数更新

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAdjuster; /**
* Created by itworker365 on 5/19/2017.
*/
public class Jdk8NewTimmer {
public static void main (String[] args) {
Instant start = Instant.now();
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
System.out.println(duration.toMillis());
System.out.println(duration.toMinutes()); LocalDate localDate = LocalDate.now();
System.out.println(localDate.getYear() + " " + localDate.getMonth());
LocalDate localDateMe = LocalDate.of(2008, 8, 8);
System.out.println(localDateMe.getYear() + " " + localDateMe.getMonth());
//2017年第十天
LocalDate someDay = localDate.of(2017,1,1).plusDays(10); //可以用.with方法调整不同的作息周期,还可以用withHout等调整对应的具体时间
TemporalAdjuster NEXT_WORKDAY = w -> {
LocalDate localDate1 = (LocalDate)w;
do {
localDate1 = localDate1.plusDays(1);
} while (localDate1.getDayOfWeek().getValue() >= 6);
return localDate1;
};
LocalDate backToWork = localDate.with(NEXT_WORKDAY);
System.out.println(backToWork.toString());
//时间根据时区调整
ZonedDateTime zonedDateTime = ZonedDateTime.of(2017,5,1,1,1,1,1, ZoneId.of("America/New_York"));
System.out.println(zonedDateTime.toString()); //各种日期信息打印格式模板
String format = DateTimeFormatter.ISO_DATE.format(localDate);
System.out.println(format);
//变为本土化显示,ofPattern自定义格式。
DateTimeFormatter format1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
System.out.println(format1.format(zonedDateTime));
}
}

JAVA8-待续的更多相关文章

  1. Java8函数式接口以及lambda表达式实践

    罗列一下遇到可以转换成lamada表达式的场景,仅供参考,如有更好的方式,欢迎在评论区留言. 1.计算订单总金额 订单总金额一般是在后台循环叠加每个购买商品的金额已获取到,通常的方式如下 BigDec ...

  2. java8新特性(六):Stream多线程并行数据处理

    转:http://blog.csdn.net/sunjin9418/article/details/53143588 将一个顺序执行的流转变成一个并发的流只要调用 parallel()方法 publi ...

  3. Java8 时间处理类的使用实践(LocalDate...)

    有了它,谁还在用Date?Calendar? 其实也不能这么绝对,毕竟还没到那个程度上.Java8 新增了处理时间的一组类(LocalDate.LocalDateTime.LocalTime),刚开始 ...

  4. Java8实战分享

    虽然很多人已经使用了JDK8,看到不少代码,貌似大家对于Java语言or SDK的使用看起来还是停留在7甚至6. Java8在流式 or 链式处理,并发 or 并行方面增强了很多,函数式的风格使代码可 ...

  5. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  6. javascript有用小功能总结(未完待续)

    1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...

  7. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  8. Android Studio2.1.2 Java8环境下引用Java Library编译出错

    转载请注明出处:http://www.cnblogs.com/LT5505/p/5685242.html 问题:在Android Studio2.1.2+Java8的环境下,引用Java Librar ...

  9. Java笔记——Java8特性之Lambda、方法引用和Streams

    Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...

  10. 关于DOM的一些总结(未完待续......)

    DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...

随机推荐

  1. redis集群创建

    先参考文章 https://www.cnblogs.com/PatrickLiu/p/8458788.html https://blog.csdn.net/fengshizty/article/det ...

  2. ZBench: 服务器一键测试脚本 / 自带结果导出vps网络测试

    zbench主站: https://blog.liyuans.com/archives/Zbench.html 脚本来自友链 主机博客,项目地址为 https://github.com/Functio ...

  3. vue todolist 封装localstorage

    //封装操作localstorage本地存储的方法 模块化的文件 // nodejs 基础 var storage={ set(key,value){ localStorage.setItem(key ...

  4. tensorflow读取数据的方式

    转载:https://blog.csdn.net/u014038273/article/details/77989221 TensorFlow程序读取数据一共有四种方法(一般针对图像): 供给数据(F ...

  5. set函数&操作

    集合的交叉并补 交集, 共同的部分 set1 & set2 set1.intersection(set2) 差集 set1有set2没有的元素 set1 - set2 set1.differe ...

  6. Apache poi简介及代码操作Excel

    一.简介 在我们进行企业的系统开发时,难免会遇到网页表格和Excel之间的操作问题(POI是个不错的选择) Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序 ...

  7. 我推荐阅读的微信公众号-IT类

    微信,正深刻影响着我们的生活,每个使用微信的人,从微信这个窗口去了解这个世界. 微信公众号,微信生态圈是核心功能之一,每天都有大量的文章创作.传播.转发出来,海量的信息扑面而来,微信阅读成为微信使用者 ...

  8. Android 硬编码

    public class TextViewActivity extends Activity { // 声明TextView对象 private TextView textView; @Overrid ...

  9. 11 vim文本编辑器

    和sed相比,sed为字处理器(行编辑器),将文本逐行放入到模式空间(也就是内存)中进行处理,并显示在屏幕上.而vim.vi以及nano都是全屏文本编辑器,而vim则是vi的加强版本,相对于vi,vi ...

  10. 元组,列表的增删改查, for,range 循环

    1. list(增删改查) 列表可以装大量的数据. 不限制数据类型. 表示方式:[] 方括号中的每一项用逗号隔开 列表和字符串一样.也有索引和切片 常用的功能: 1. 增: append() 2. 删 ...