jdk8集合的使用以及lambda表达式

1,代码实例一

 List<Integer> list= Arrays.asList(1,2,3,3,4,5,6);
        list.forEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.println(integer);
            }
        });

forEach源码

 /**
     * Performs the given action for each element of the {@code Iterable}
     * until all elements have been processed or the action throws an
     * exception.  Unless otherwise specified by the implementing class,
     * actions are performed in the order of iteration (if an iteration order
     * is specified).  Exceptions thrown by the action are relayed to the
     * caller.
     *
对iterable的每个元素执行给定的操作
直到处理完所有元素或操作引发
异常。除非实现类另有指定,否则将按迭代顺序执行操作(如果迭代顺序
已指定)。操作引发的异常将中继到调用方。
     * @implSpec
     * <p>The default implementation behaves as if:
     * <pre>{@code
     *     for (T t : this)
     *         action.accept(t);
     * }</pre>
     *
     * @param action The action to be performed for each element
     * @throws NullPointerException if the specified action is null
     * @since 1.8
     */
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
图片.png

consumer

/**
 * Represents an operation that accepts a single input argument and returns no
 * result. Unlike most other functional interfaces, {@code Consumer} is expected
 * to operate via side-effects.
表示一种操作,传入单个值,且没有返回,不想其他大多数函数式接口,Consumer被认为是有副作用的操作
 * <p>This is a <a href="package-summary.html">functional interface</a>
 * whose functional method is {@link #accept(Object)}.
 *
 * @param <T> the type of the input to the operation
 *
 * @since 1.8
 */
@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);

2,代码实例二

 list.forEach(i->{
            System.out.println(i);
        });
 list.forEach(System.out::println);

当你ctrl+鼠标点击->和::时,跳
图片.png

3,代码实例三

Conceptually, a functional interface has exactly one abstract
 * method.  Since {@linkplain java.lang.reflect.Method#isDefault()
 * default methods} have an implementation, they are not abstract.  If
 * an interface declares an abstract method overriding one of the
 * public methods of {@code java.lang.Object}, that also does
 * <em>not</em> count toward the interface's abstract method count
 * since any implementation of the interface will have an
 * implementation from {@code java.lang.Object} or elsewhere.

简单来说,函数式接口中只能有一个抽象方法,但是如果和object类中的方法重名,也可以有(可以重写)

@FunctionalInterface
public interface Test03 {
    void test();
    //会报错
    //只能有一个抽象方法
    // void test2();
    //不会报错,因为他是继承java.lang.Object对象的方法,并不会算大抽象方法里面去
    String toString();
}
* <p>Note that instances of functional interfaces can be created with
 * lambda expressions, method references, or constructor references.

函数式接口可以通过lambda表达式,函数引用或者构造器引用

4,代码实例4

 Test04MyInterface test04MyInterface=()->{
            System.out.println("test");
        };
        System.out.println(test04MyInterface.getClass());
        System.out.println(test04MyInterface.getClass().getSuperclass());
        System.out.println(test04MyInterface.getClass().getInterfaces()[0]);

lambda表达式创建的相当于是一个对象

5,代码实例6

需求:将list中的字符串内容大写然后输出

 List<String> list= Arrays.asList("hello","String","hello world");
        //jdk8的写法
        list.forEach(i->System.out.println(i));
        //需求二:构造新的集合,存放变成大写的数据
        List<String> list2=new ArrayList<>();
        //写法1
        list.forEach(i->{
            list.add(i.toUpperCase());
        });
        list.forEach(i->{
            System.out.println(i);
        });
        //写法2
        list.stream().map(item->item.toUpperCase()).forEach(item->System.out.println(item));
        //写法3
        list.stream().map(String::toUpperCase).forEach(System.out::println);

stream()方法解析

 /**
     * Returns a sequential {@code Stream} with this collection as its source.
     * 返回此集合的序列流
     * <p>This method should be overridden when the {@link #spliterator()}
     * method cannot return a spliterator that is {@code IMMUTABLE},
     * {@code CONCURRENT}, or <em>late-binding</em>. (See {@link #spliterator()}
     * for details.)
     *
     * @implSpec
     * The default implementation creates a sequential {@code Stream} from the
     * collection's {@code Spliterator}.
     *
     * @return a sequential {@code Stream} over the elements in this collection
     * @since 1.8
     */
    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
  /**
     * Returns a stream consisting of the results of applying the given
     * function to the elements of this stream.
     * 返回一个流,由以下组成
        给定的函数操作此流的元素的结果,返回
     * <p>This is an <a href="package-summary.html#StreamOps">intermediate
     * operation</a>.
     *
     * @param <R> The element type of the new stream
     * @param mapper a <a href="package-summary.html#NonInterference">non-interfering</a>,
     *               <a href="package-summary.html#Statelessness">stateless</a>
     *               function to apply to each element
     * @return the new stream
     */
    <R> Stream<R> map(Function<? super T, ? extends R> mapper);
图片.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前段时间一直在看lambda表达式,但是总感觉吃不透,在深入了解lambda表达式的时候,需要很多基础的知识栈。这...
    西瓜真好吃丶阅读 2,745评论 0 7
  • 简介 概念 Lambda 表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主...
    刘涤生阅读 3,240评论 5 18
  • 写在开头:本人打算开始写一个Kotlin系列的教程,一是使自己记忆和理解的更加深刻,二是可以分享给同样想学习Kot...
    胡奚冰阅读 1,293评论 0 6
  • 声明:本文翻译自The Java™ Tutorials(官方文档) 简述 匿名类有一个问题,如果匿名类的实现非常简...
    猴子小皮球阅读 4,720评论 0 9
  • 昨天看了一则小视频,里面有个故事,挺有道理,记录如下: 曾仕强讲的,他在山东曲阜孔子老家旅游,听过这样一个故事,不...
    看路赶路阅读 1,178评论 9 6