【水】告别 for 循环告别 if 实现数组去重

偶尔善良 提交于 2019-12-23 05:18:58

告别 for 循环告别 if 实现数组去重

水博客 >.<

刷博客时偶尔也会看到有时候面试提到 jdk8 的新特性(反正我没遇到过>.<)
今天就来以一个简单例子来搞搞这个 ♥ 特性 之 stream流 和 lambda表达式

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

import static java.util.stream.Collectors.toList;
    @Test
    public void distincFunc(){
        String [] strArr = {"zhao","qian","sun","li","zhao","qian","sun","li"};
        // distinct()方法去重
        List<String> collect = Arrays.stream(strArr).distinct().collect(toList());
        // 传统遍历方式
        for (String c:
                collect) {
            System.out.println(c);
        } 
		// 下面用lambda 表达式改造
        collect.forEach( c-> System.out.println(c) );
    }

注意这里从数组转换成集合了(主要是集合能直接 foreach 然后演示lambda表达式),不过也可以在 去重方法后面改 链 .toArray()方法得到一个 Object数组。

好了,说完了再见!

当然没有

在这里插入图片描述

我们大胆点进去 按住 Ctrl + 左键(最多看不懂好像没啥损失),可以看到实际是DistinctOps这个对象的markRef() 方法 在搞鬼 ,快看到重点了 再冲进去看看。

    /**
     * Appends a "distinct" operation to the provided stream, and returns the
     * new stream.
     *
     * @param <T> the type of both input and output elements
     * @param upstream a reference stream with element type T
     * @return the new stream
     */
    static <T> ReferencePipeline<T, T> makeRef(AbstractPipeline<?, T, ?> upstream) {
        return new ReferencePipeline.StatefulOp<T, T>(upstream, StreamShape.REFERENCE,
                                                      StreamOpFlag.IS_DISTINCT | StreamOpFlag.NOT_SIZED) {

            <P_IN> Node<T> reduce(PipelineHelper<T> helper, Spliterator<P_IN> spliterator) {
                // If the stream is SORTED then it should also be ORDERED so the following will also
                // preserve the sort order
                TerminalOp<T, LinkedHashSet<T>> reduceOp
                        = ReduceOps.<T, LinkedHashSet<T>>makeRef(LinkedHashSet::new, LinkedHashSet::add,
                                                                 LinkedHashSet::addAll);
                return Nodes.node(reduceOp.evaluateParallel(helper, spliterator));
            }

em…好像打扰了,走了。
在这里插入图片描述

等等 我好像看到了什么

在这里插入图片描述

那么我们大胆猜测 distinct方法实际使用 LinkHashSet 实现的去重操作,其他还是看不懂哈哈(千层封装调用,看到一半放弃了),面试说到这里应该也差不多了

有时间有精力的大神可以教教我,跪求!

再来说说 lambda 吧

多了也不懂我就是个臭打代码的,只能在 运用 的层面唇枪舌剑一番

在这里插入图片描述

//	返回给定字符串的长度	
(String	str) ->	 str.length()
//	始终返回233的无参方法	
() -> 233
//	返回当前用户是否年龄大于18岁,返回一个boolean值
(User user) -> user.getAge() >	18
//	包含多行表达式,需用花括号括起来,并使用return关键字返回 
(int x,	int	y) -> {
	int	z =	x *	y;
	return	x + z;
}
// 遍历集合
List list =	Arrays.asList(1, 2, 3, 4, 5, 6);	
list.forEach(i -> System.out.println(i));

可以看出 lambda表达式作为 一次性使用的函数 的写法是非常简约(装b)的。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!