美文网首页
java8的简单使用

java8的简单使用

作者: Pale_Eyes | 来源:发表于2017-11-02 12:32 被阅读0次

注:总体参照网络分享的东西进行学习的如:http://ifeve.com/stream/

1.lambda表达式简单使用

lambda表达式之前就有听说过,但也没有系统的学习过,此处也不算系统的学习,而且目前我还没有找到学习方法,只是在网上找对于lambda表达式的基本使用,然后自己试一下这样子。
在没有java8的lambda表达式前,我写一个将一个List<String>的所有字符串转为小写字符的东西。(除了lambda表达式也用到了其他东西,组合更好用的样子,大家都是这么玩的)

    @Test
    public void test03(){
        //lambda
        List<String> names = new ArrayList<>();
        names.add("yanyan");
        names.add("linzhihe");
        List<String> lowercaseNames = names.stream().map((String name) -> {return name.toLowerCase();}).collect(Collectors.toList());

        //没有jdk8 自己的写法
        List<String> names1 = new ArrayList<>();
        names1.add("yanyan");
        names1.add("linzhihe");
        List<String> lowercaseNames1 = new ArrayList<>();
        for (String name : names1) {
            lowercaseNames1.add(name.toLowerCase());
        }

        //没有jdk8 高手的写法(据说这个是什么声明式编程,我那种叫命令式编程)
        List<String> names2 = new ArrayList<>();
        names.add("yanyan");
        names.add("linzhihe");
        List<String> lowercaseNames2 = FluentIterable.from(names2).transform(new Function<String, String>() {
            @Override
            public String apply(String name) {
                return name.toLowerCase();
            }
        }).toList();

    }

当然高手的那种声明式的写法,我现在水平还不够,不能理解中间的奥义,lambda还可以理解,简化写也行

        List<String> lowercaseNames = names.stream().map(name -> name.toLowerCase()).collect(Collectors.toList());

甚至于可以用::关键词,当然这个以前也没用过,此处不做深究

        List<String> lowercaseNames = names.stream().map(String::toLowerCase).collect(Collectors.toList());

lambda END 简单总结:
语法结构如下:

(Type1 param1,Type2 Param2,...TypeN ParamN) ->
{
执行语句1;
执行语句2;
...
执行语句N;
retrun *;
}

2.java.util.function.Predicate

作用:Represents a predicate (boolean-valued function) of one argument.(表示一个参数的布尔值函数)
这个点的学习也是在网上别人的分享来学习的,很多有问题,后来自己尝试着源码,觉得效果很好,这个接口源码如下

package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Predicate<T> {

    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

大概就是返回true或false。而依据是t(demo里是(str)->str.equals("Java"),当然方法里我自己加了or方法源码里一看就很容易明白),比如

    @Test
    public void test06(){
        List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp", "JavaScript");
        filter(languages, (str)->str.equals("Java"));

    }

    public static void filter(List<String> names, Predicate condition) {
        names.forEach((name)->{
            if(condition.or((str)->str.equals("JavaScript")).test(name)) {
                System.out.println("I like " + name + " ");
            }
        });
    }

2.java.util.function.Consumer

作用:Performs this operation on the given argument(在给定的参数上执行此操作)
源码:


3.java.util.Optional

作用:A container object which may or may not contain a non-null value(一个容器对象,它可能包含或不包含非空值)
它的ifPresent就是Consumer接口的一个例子。

 public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }

4. A::B

A的B方法

5.java.util.stream.Stream

Returns a stream consisting of the elements of this stream that match the given predicate(返回由流元素组成的流,该流与给定predicate匹配。)

List<Integer> nums = Lists.newArrayList(1,1,null,2,3,4,null,5,6,7,8,9,10);
System.out.println("sum is:"+nums.stream().filter(num -> num != null).distinct().
mapToInt(num -> num * 2).peek(MyTest::print).skip(2).limit(4).sum());

n.其他(待验证)

  • 接口的默认方法
  • 函数式接口
    ...

补充

<? extends T>和<? super T>

解释起来比较麻烦,我也不是太懂。
频繁往外读取内容的,适合用上界Extends。
经常往里插入的,适合用下界Super。

相关文章

网友评论

      本文标题:java8的简单使用

      本文链接:https://www.haomeiwen.com/subject/wmvwpxtx.html