一. 函数式编程
(1)
lambda 表达式
首先在这里引入了一个
函数式接口
的概念
函数式接口: 就是接口中只包含一个抽象方法的接口
这里引入了一个注解
@FunctionalInterface
这个注解标注的接口都只能有一个方法 否则编译器就会报错, 而我们在写函数式接口的时候不是必须加这个注解 因为我们的jvm会自动识别你这个接口属于函数式接口!
java.util.Function 下有许多函数式接口 他们有不同的作用 都可以以如下的方式使用:
public static void
main(String[] args) {
List<Integer> list = Arrays.
asList
(
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
);
System.
out
.println(
"此处输出的是偶数"
);
eval
(list, (n) -> n %
2
==
0
);
System.
out
.println(
"所有数"
);
eval
(list, (n) ->
true
);
}
public static void
eval(List<Integer> list, Predicate<Integer> predicate) {
for
(Integer n : list) {
if
(predicate.test(n)) {
System.
out
.println(n);
}
}
}
这就使用了函数式的编程思想:
格式:
(参数) -> {方法体};
参数没有的情况下 用()表示
lambda 表达式是服务于 接口的 他可以动态的实现一个接口的方法 所以 他的作用就是可以取代匿名内部类
public class
OpLambda {
private static
String
s
=
"ok"
;
public static void
main(String[] args) {
MathOperation add = (
int
a,
int
b) -> {
return
a + b;};
MathOperation mul = (a, b) -> a * b;
MathOperation mul2 = (a, b) -> {
a++;
b++;
return
a * b;
};
operator
(
1
,
2
,add);
operator
(
1
,
2
,mul);
operator
(
1
,
2
,mul2);
s
=
"hello"
;
StringUtil su = str ->
System.
out
.println(str);
su.sayString(
s
);
}
public static void
operator(
int
a,
int
b, MathOperation op) {
System.
out
.println(op.operator(a,b));
}
}
interface
MathOperation{
int
operator(
int
a,
int
b);
}
interface
StringUtil {
void
sayString(String str);
}
(2)
新增的方法 (函数式编程)
1. foreach 这是java集合iterator(迭代器) 中新加入的方法
Iterable<String> it = (Iterable<String>) list.iterator();
it.forEach(
new
Consumer<String>() {
@Override
public void
accept(String s) {
System.
out
.println(s);
}
});
(3)
方法引用
某些lambda表达式里面仅仅是执行一个方法调用。在这种情况下,不用lambda表达式,直接通过方法名称引用方法的形式可读性更高一些,这种形式就是方法引用,方法引用是一种更简洁易懂的lambda 表达式。
方式:(某个对象)::(他的方法)
最典型的应用: (System.out::println)
(4)
Optional
Optional是一个容器对象,用于容纳非空对象。Optional对象通过缺失值值代表null。这个类有许多实用的方法来促使代码能够处理一些像可用或者不可用的值,而不是检查那些空值(null)。Java 8中引入的这个特性有点像Google Guava里的Optional(Guava 是一个 Google 的基于Java 6的类库集合的扩展项目)。
在Java官方文档的解释中,它是一个可以为null的容器对象。如果值存在则 isPresent() 方法会返回 true ,调用 get()方法会返回该对象。
http://www.importnew.com/6675.html
Optional 里的方法参考这个网址
在这里解释几个方法:
of: 创建Optional 不过值不能为空
ofNullable: 创建Optional 值可以为空
ifPresent: 如果有值调用()中的方法
isPresent:有没有值 有返回true 没有false
get: 得到值
orElse: 如果有值直接返回 没有就指定值
orElseGet: 如果有直接返回 没有的话直接返回
二.Stream 流
(1)产生流的方式:
Stream: 串行
parallelStream: 并行
(2)相关的方法:
forEach :
这个就是遍历和我印象中的方法一致
map:
对流里的每个元素执行一个操作 需要一个函数(i -> i+1)
filter
: 顾名思义过滤器 可以过滤很多东西 需要一个函数 (i -> i > 10)
limit
: 取多少个
distinct
: 去重
sorted
: 排序可以加一个函数 也可以不加(对于int型来说 不需要加)
collect
() : 这个可以将你之前的操作转换成LIst等
.collect(Collectors.toList());
summaryStatistics:
这个方法是用来生成一个对Stream的统计数据 和这个相关的有一系列类:
IntSummaryStatistics(DoubleSummarystatistics..等)
里头有很多方法 例如getSum() getMax() 等的就可以快速的得到我们需要的信息
reduce() : 这个函数类似于collect() 这个和collect()的区别是reduce() 处理的每个元素都会创建一个新的对象.
java 流和lambda表达式的应用实例
三.时间函数 (记录一下有哪些方法 之后用的时候补全应用)
(1) LocalDateTime:
LocalDate:
LocalTime:
(2)ZonedDateTime:
Zoneid
(3)涉及一个类:
java.time.temporal.ChronoUtil 这个枚举类里头有很多有关于时间的枚举
可以直接调用.plus() 方法来给时间增量
(4)Period:操作Date between 方法可以计算两个日期之间的时间
Duration:操作time
-----------------未完待续