java1.8新特性之stream
什么是Stream?Stream字面意思是流,在java中是指一个来自数据源的元素队列并支持聚合操作,存在于java.util包中,又或者说是能应用在一组元素上一次执行的操作序列。(stream是一个由特定类型对象组成的一个支持聚合操作的队列。)注意Java中的Stream并不会存储元素,而是按需计算。关于这个概念需要以下几点解释:1、数据源流的来源。 它可以是列表,集合,数组(java.util.Collection的子类),I/O channel, 产生器generator等(注意Map是不支持的);2、聚合操作。类似于SQL语句一样的操作, 如filter, map, reduce, find, match, sorted等。因此stream流和以前的Collection操作是完全不同, Stream操作还有两个非常基础的特征:Pipelining和内部迭代。
Pipelining也就是中间操作,它都会返回流对象本身。 这样多个操作的设计可以串联起不同的运算操作,进而形成一个管道, 如同流式风格(fluent style)。 这样做还可以对操作进行优化, 比如延迟执行(lazin ...
java泛型的那些事
学习泛型的理由首先明确为什么需要学习泛型?个人觉得至少有三个理由:1、使用泛型可以让你在声明类(或者创建方法)的时候不着急立即去指定它的类型,而是等到你实例化对象(或者方法调用)的时候才明确它的类型;2、避免通过使用Object类型来泛指java对象时,因类型强制向下转型时发生错误;3、可以毫无障碍的阅读Java相关源码。你经常遇到诸如Comparator<? super E> comparator和List<? extends Number>此类的代码,可能不太明白其中的含义,如果你学会了泛型,就毫无压力可以从容地面对那些代码了。
什么是泛型泛型不光是在java,在很多面向对象语言及各种设计模式中有广泛的应用。所谓的泛型,其实就是把类型“参数化”。
一提到参数,大家最熟悉的就是定义方法时的形参和调用方法时的实参。那么类型“参数化”到底怎么理解呢?顾名思义,类型“参数化”就是将类型由原来的具体类型,变成参数化的“类型”,有点类似于方法中的变量参数,不过此时是类型定义成参数形式(你可以理解为类型形参),然后在使用时传入具体的类型(也就是类型实参)。为什么这样操作呢 ...
Python高级编程(32):Python中的is和==的区别?
is和==的区别1、is 比较的是地址,注意小整数池和字符串,一般重复创建的时候会指向同一个对象。
123456789101112t1 = 123t2 = 123print(t1 is t2) # Trueprint(id(t1), id(t2)) # 1789477024 1789477024print("*********************************")l1 = [1,2,3]l2 = [1,2,3] # False,因为会重新声明一个对象# l2 = l1 # True,因为是赋值符号,就是指针指向print(l1 is l2) # Falseprint(id(l1), id(l2)) # 56509864 56511024
因为在python中存在intern机制,适用于小整数池和字符串,也就是说创建对象的时候会先在小整数池中查找,如果存在就返回,否则就会新建对象。记住仅仅适用于小整数池和字符串,对于list是不使用的
2、== 比较的是值,其实==重载了对象的__eq__方法,而这个方法比较的是对象的值。
12345678t ...
Python高级编程(31):Python中的变量是什么?
首先明确Python中的变量和Java中的变量是有本质区别的,在Java中在变量声明的时候需要指定数据类型,然后像虚拟机中申请内存,这个内存的大小其实和数据类型相关,这就好像是一个盒子,这个盒子能装什么其实已经确定下来。但是在Python中却不是这样的,Python中的变量本质上是一个指针,每个指针的大小都一样,它可以指向任意的对象,它保存的是对一个对象的引用。它本身并不会存放对象,它只是代表一个标签,通过这个标签可以找到具体存放对象的地方。你也可以将变量理解为一个便利贴。
a = 1 或者 a = ‘abc’的过程: 先在内存中创建一个int对象或者str对象,然后他们的值是1和abc,然后将a这个便利贴到它们身上,之后你访问a就相当于是在访问它们,非常类似于对象的引用。Python的动态性就是因为它的所有的变量的大小都是一样的,都代表了一个指针。其变量赋值的过程是,先声明对象,然后再建立关联引用。
1234567891011a = [1,2,3,4]b = aprint(id(a), id(b)) # b和a对应的是同一个对象print(a is b)b.append(5)pri ...
Python高级编程(30):dict和set的实现原理
我们为什么需要了解dict和set的实现原理呢?因为只有了解了其背后的实现原理,我们才能更好的的知道什么情况下使用dict以及set,这一点很重要,结合实际的情况使用不同的数据结构可能会产生很大的区别。
先通过一段测试代码了解一下它们性能之间的区别:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283from random import randintdef load_list_data(total_nums, target_nums): """ 从文件中读取数据,以list的方式返回 :param total_nums: 读取的数量 :param target_nums: 需要查询的数据的数量 """ all_data = [] ...
Python高级编程(29):set和frozenset
set是集合,frozenset则是不可变集合,集合的特点是无序和不重复,可以用于元素去重操作。
查看一下set的源码:
123456789def __init__(self, seq=()): # known special case of set.__init__ """ set() -> new empty set object set(iterable) -> new set object Build an unordered collection of unique elements. # (copied from class doc) """ pass
因此可以使用iterable对象作为参数,构建集合。
1234567891011121314151617181920212223242526s1 = set('abcd')s2 = set(['a', 'b', 'c', ...
Python高级编程(28):dict的子类
python中一切都可以被继承,dict自然不例外,但是我们并不建议大家去继承Python中的内置的像list,dict等数据结构,特别是用C语言写的数据结构,因为有些操作不会生效。1. 自定义一个字典时,不要直接继承自dict,因为有些操作会不生效
1234567891011121314class MyDict(dict): def __setitem__(self, key, value): # 重写父类的setitem方法,似乎并没有什么用 super(MyDict, self).__setitem__(key, value*5)# 首先明确下面两种方式其本质是一致的操作,都会调用__setitem__这个魔法函数mydict = MyDict(one=2)print(mydict)mydict['one'] =2print(mydict)# 运行结果:{'one': 2}{'one': 10}
也就是是说在某些情况下,用C语言写的Python内置 ...
Python高级编程(27):dict的常用方法
本篇我们来聊一下Python中dict的常用方法,这个还是挺重要的,所以可以多花点时间学习一下。
123456789101112131415161718192021222324252627282930313233343536a = { 'xiaoming': {'sex': 'male'}, 'xiaobai': {'sex': 'female'}}# clear()清空字典# a.clear()# print(a)# copy() 浅拷贝# new_copy_a = a.copy()# new_copy_a['xiaoming']['sex']= 'female'# print(new_copy_a)# print(a)# copy,浅拷贝,只拷贝了最外层的对象的引用,如果浅拷贝的# 时候有可变对象的应用,则如果修改了原来的值,则可变对 ...
Python高级编程(26):dict的abc继承关系
Python字典中的dict其实是一种Mapping类型,我们可以使用isinstance判断一下,发现是真的:
12345678910from _collections_abc import Mapping, MutableMappingprint(type(dict)) # type类型print(isinstance(dict, MutableMapping)) # False,因为isinsatance的第一个参数是object而不是一个类a ={}print(isinstance(a, MutableMapping)) # True,a 并不是继承MutableMapping,而是实现了MutableMapping中的方法
我们可以查看MutableMapping的源码,可以发现MutableMapping只是将dict注册进去而已
1MutableMapping.register(dict)
具体的点击这里
Python高级编程(25):列表推导式、生成器表达式、字典推导式
列表(生成)推导式我们有一个需求,输出10以内的所有奇数:
12345678910old_list = []for i in range(10): if i % 2 ==1: old_list.append(i)print(old_list)# 输出结果:[1, 3, 5, 7, 9]
现在我们对其进行修改,利用列表生成式来实现相同的功能:
12345a = [i for i in range(10) if i % 2 ==1]print(a)# 输出结果:[1, 3, 5, 7, 9]
是不是很简单,我们加一点困难,返回那些奇数的平方,同样也是使用列表生成式来完成:
123456789def sequreitem(item): return item*itema = [sequreitem(i) for i in range(10) if i % 2 ==1]b = [i**2 for i in range(10) if i % 2 == 1]print(a)print(b)
这样看起来也是很简单的,但是一旦有更多的逻辑,我们就不要用了,因为代码的可读性是非 ...