您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

Android应用安全常见问题及解决方案灵魂拷问

导语

你想做安卓开发,怎么系统学习?你只需要看完这一篇就够了!!为什么只看这一篇就够了?现在CSDN、知乎、掘金、GitHub上各路大佬层出不穷,他们深耕Android开发多年,总结出满满的学习干货。但同时也存在很多非良心的博主,要么活出了人类的本质,复读机一样到处转载;

要么纯粹自嗨型草草说了自己的工作经历,让读者无法从良莠不齐的资源海洋中高效高质地获取真正有用的信息。本文的目的很简单,一句话:用最少的时间,最高效率,让你清楚:想要做Android开发,你需要学什么?你该在哪学?

本文的特点在于将繁琐的知识化为系列专题的形式展现给读者,当你能跟随博主构建的体系化学习知识点时,恭喜你,你已经干掉了BAT、字节、网易等大厂的几乎80%以上的Android开发人员。这种无所不知的痛快感,是不是感觉你已成为别人眼中的大神了?

1. 前言

上一篇文章讲了Stream的基本操作,这篇文章我们介绍中间操作和结束操作及其Stream的一些特性。

2.操作类型

一个Stream流表示一系列元素并且可以在这些元素上进行计算。流的操作要么是中间操作要么是结束操作。我们以如下代码来描述:

List<String> myList =
    Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

代码中filter,map,sorted属于中间操作,forEach属于结束操作。如果你想看所有流操作那么去Stream Javadoc查看,这样一种链式的操作叫做管道操作。

大部分Stream操作支持lambda表达式,这些操作具有无干扰和无状态的特性。我们具体来看下无干扰和无状态是什么意思。

我们有如下代码:

public static void main(String[] args) {
        List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

        myList.stream().filter(s -> s.startsWith("c")).map(String::toUpperCase).sorted()
            .forEach(s -> System.out.println(s));

        System.out.println("after stream,the myList is " + myList);
    }

执行后结果如下:

C1
C2
after stream,the myList is [a1, a2, b1, c2, c1]

可以看到当我执行了流相关操作后,mylist列表没有被改变,这就是无干扰特性。

我们再来看一段代码:

  int i = 0;
        myList.stream().filter(s -> s.startsWith("c")).map(String::toUpperCase).sorted().forEach(s -> {
            System.out.println(s);
            i++;//这里编译会报错
        });

如上代码在i++那行会编译报错,错误提示为:Variable used in lambda expression should be final or effectively final,意思是在lambda表达式中使用的变量必须是或者等同于final类型的,意味着我们不能在lambda表达式中修改外部非final变量。

3. 高级操作

上一篇文章讲了基本操作,这一节我们说一下一些相对复杂的操作,比方说flatMapreduce操作。

我们已经使用过map操作,但是 map操作是有局限的,因为每个对象只能够被映射到另一个对象。如果我们想把一个对象转换多个对象该怎么办呢?这时我们需要使用FlatMap

为了演示FlatMap我们先定义连个对象:

class Foo {
    String name;
    List<Bar> bars = new ArrayList<>();

    Foo(String name) {
        this.name = name;
    }
}

class Bar {
    String name;

    Bar(String name) {
        this.name = name;
    }
}

然后我们实例化一些Foo对象和一些Bar对象。

List<Foo> foos = new ArrayList<>();

        // create foos
        IntStream.range(1, 4).forEach(i -> foos.add(new Foo("Foo" + i)));
        System.out.println("foos " + foos);

        // create bars
        foos.forEach(f -> IntStream.range(1, 4).forEach(i -> f.bars.add(new Bar("Bar" + i + " <- " + f.name))));
        System.out.println("foos with bars " + foos);


执行结果如下:

foos [Foo{name='Foo1', bars=[]}, Foo{name='Foo2', bars=[]}, Foo{name='Foo3', bars=[]}]
foos with bars [Foo{name='Foo1', bars=[Bar{name='Bar1 <- Foo1'}, Bar{name='Bar2 <- Foo1'}, Bar{name='Bar3 <- Foo1'}]}, Foo{name='Foo2', bars=[Bar{name='Bar1 <- Foo2'}, Bar{name='Bar2 <- Foo2'}, Bar{name='Bar3 <- Foo2'}]}, Foo{name='Foo3', bars=[Bar{name='Bar1 <- Foo3'}, Bar{name='Bar2 <- Foo3'}, Bar{name='Bar3 <- Foo3'}]}]

可以看到产生的对象里Foo1bars列表里有bar1<-Fool,bar2<-Fool,bar3<-Fool,Fool2Fool3也同样是。

我现在想把其中关联的所有bar都打印出来,这里可以使用flatMapflatMap接收一个Function,这个Function会把一个对象转化为以一个Stream,然后通过forEach会把这些返回的Stream里的元素都打印出来,这样就把3个Foo对象转化为了9个Bar对象。

        // 打印出其中的bar出来
        foos.stream().flatMap(f -> f.bars.stream()).forEach(b -> System.out.println(b.name));

4. 懒执行

Stream的懒执行特性是什么呢?如果没有执行上面所说的结束方法,那么中间操作是不会执行的。我们来看一段代码:

 public static void main(String[] args) {
     
        Stream.of("d2", "a2", "b1", "b3", "c").filter(s -> {
            System.out.println("filter1: " + s);
            return true;
        });
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

        Stream.of("d2", "a2", "b1", "b3", "c").filter(s -> {
            System.out.println("filter2: " + s);
            return true;
        }).forEach(s -> System.out.println("forEach2: " + s));
    }

执行结果如下:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
filter2: d2
forEach2: d2
filter2: a2
forEach2: a2
filter2: b1
forEach2: b1
filter2: b3
forEach2: b3
filter2: c
forEach2: c

从打印结果中filter1:没有被打印,我们可以得出第一个流Stream.of("d2", "a2", "b1", "b3", "c")没有被执行,原因是没有结束操作。而第二个流Stream.of("d2", "a2", "b1", "b3", "c")后面有.forEach操作,那么该流上的filterforEach操作都被执行了。

5. 总结

本文讲解了流的操作类型及其FlatMap等高级操作,后面 又介绍了懒 执行特性。下一章我们会介绍Stream的执行顺序。

文末

那么对于想坚持程序员这行的真的就一点希望都没有吗?
其实不然,在互联网的大浪淘沙之下,留下的永远是最优秀的,我们考虑的不是哪个行业差哪个行业难,就逃避掉这些,无论哪个行业,都会有他的问题,但是无论哪个行业都会有站在最顶端的那群人。我们要做的就是努力提升自己,让自己站在最顶端,学历不够那就去读,知识不够那就去学。人之所以为人,不就是有解决问题的能力吗?挡住自己的由于只有自己。点击我的腾讯文档下述资料免费领取
Android希望=技能+面试

  • 技能

  • 面试技巧+面试题
    ,不就是有解决问题的能力吗?挡住自己的由于只有自己。点击我的腾讯文档下述资料免费领取
    Android希望=技能+面试

  • 技能
    [外链图片转存中…(img-SXehSfKH-1623419018094)]

  • 面试技巧+面试题


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进