Open xieyipeng opened 6 years ago
抽象类: 抽象类中可以有抽象方法,抽象方法,可以只定义方法,不用写方法的实现。普通类继承抽象类必须要实现抽象类的方法,抽象类继承抽象类可以实现抽象方法也可以不实现。
接口: 只定义方法,不写方法的实现。一个接口可以继承另一个接口,一个类可以实现一个或多个接口。
有了接口为什么还要有抽象类? java中,只能实现单继承,但可以实现多个接口。假定现在有3个类,A1,A2,A3,都实现接口B,同时他们三个都想要实现接口的某个方法,而接口中不能定义方法实体,就必须在他们三个内部重复写三遍相同的代码。这种做法明显不符合代码重用的规则。因此可以重新写一个抽象类C,在抽象类内实现该方法,再令他们三个实现接口同时继承C。因此,并不能没有抽象类。
司令员下令让士兵去干件事情,司令员的作用是,发出命令,命令经过传递,传到士兵,士兵去执行。三者相互解耦,任何一方不用依赖另一方,只要做好自己的事情就行。
command
package day2;
public interface Command {
public void exe();
}
package day2;
/**
* 长官
*/
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void action(){
command.exe();
}
}
package day2;
/**
* 士兵
*/
public class Receiver {
public void action(){
System.out.println("command received!");
}
}
package day2;
/**
* 命令
*/
public class MyCommand implements Command{
private Receiver receiver;
public MyCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void exe() {
receiver.action();
}
}
package day2;
public class test {
public static void main(String[] args) {
Receiver receiver=new Receiver();
Command command=new MyCommand(receiver);
Invoker invoker=new Invoker(command);
invoker.action();
}
}
1、创建Stream;
2、转换Stream,每次转换原有Stream对象不改变,返回一个新的Stream对象
3、对Stream进行聚合(Reduce)操作,获取想要的结果;
Stream<IntegerStream> IntegerStream=Stream.of(1,2,3,4,5);
Stream<String> stringStream = Stream.of("taobao");
Stream.generate(new Supplier<Double>(){
@Override
public Double get(){
return Math.random();
}
});
Stream.generate(()->Math.random);
Stream.generate(Math::random);
三条语句效果一样,生成无限长的Stream,使用了lambda表达式和方法引用来简化代码。
Stream.iterate(1,item->item+1).limit(10).forEach;
(System.out.println);
这段代码就是先获取一个无限长度的正整数集合的Stream,然后取出前10个打印
public interface Collection<E> extends Iterable<E> {
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
}
转换Stream其实就是把一个Stream通过某些行为转换成一个新的Stream。
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(System.out::println)
.skip(2)
.limit(4)
.sum());
先对java doc中的定义进行翻译:
汇聚操作(也称为折叠)接受一个元素序列为输入,反复使用某个合并操作,把序列中的元素合并成一个汇总的结果。比如查找一个数字列表的总和或者最大值,或者把这些数字累积成一个List对象。Stream接口有一些通用的汇聚操作,比如reduce()和collect();也有一些特定用途的汇聚操作,比如sum(),max()和count()。注意:sum方法不是所有的Stream对象都有的,只有IntStream、LongStream和DoubleStream是实例才有。
可变汇聚对应的方法只有一个:collect,它可以把Stream中的要有元素收集到一个结果容器collection中。
List<Integer>nums=Lists.newArrayList(1,1,null,2,3,4,null,5,6,7,8,9,10);
List<Integer> numsWithoutNull = nums.stream()
.filter(num -> num != null)
.collect(() -> new ArrayList<Integer>(),
(list, item) -> list.add(item),
(list1, list2) -> list1.addAll(list2));
List<Integer> ints = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10);
System.out.println("ints sum is:" + ints.stream().reduce((sum, item) -> sum + item).get());
package day3;
import java.util.ArrayList; import java.util.Iterator; import java.util.List;
/**
遍历集合的操作,(list,map),eg:fori,foreach,stream,iterator;
*/
public class ListTest {
public static void main(String[] args) {
List
System.out.println("fori :");
for (int i = 0; i < stringList.size(); i++) {
System.out.print(stringList.get(i).getName()+" ");
System.out.println(stringList.get(i).getAge());
}
System.out.println("foreach :");
for (Student student:
stringList) {
System.out.print(student.getName()+" ");
System.out.println(student.getAge());
}
System.out.println("stream :");
stringList.stream()
.forEach(student -> System.out.println(student.getName()+" "+student.getAge()));
System.out.println("iterator :");
Iterator iterator=stringList.iterator();
while (iterator.hasNext()){
Student student=(Student)iterator.next();
System.out.println(student.getName()+" "+student.getAge());
}
} }
```java
//运行结果
fori :
a 16
b 15
c 18
d 11
e 16
f 19
j 12
h 14
i 17
j 16
foreach :
a 16
b 15
c 18
d 11
e 16
f 19
j 12
h 14
i 17
j 16
stream :
a 16
b 15
c 18
d 11
e 16
f 19
j 12
h 14
i 17
j 16
iterator :
a 16
b 15
c 18
d 11
e 16
f 19
j 12
h 14
i 17
j 16
package day3;
import java.util.*; public class MapTest { public static void main(String[] args) { Map<Integer,Student>map=new HashMap<>(); map.put(1,new Student(12,"a")); map.put(2,new Student(18,"b")); map.put(3,new Student(14,"c")); map.put(4,new Student(16,"d")); map.put(5,new Student(13,"e")); map.put(6,new Student(11,"f")); map.put(7,new Student(12,"j")); map.put(8,new Student(15,"h")); map.put(9,new Student(14,"i")); map.put(10,new Student(18,"g"));
System.out.println("fori :");
for (Map.Entry<Integer,Student> entry:map.entrySet()) {
System.out.print(entry.getKey() + " = ");
System.out.println(entry.getValue().getAge() + " " + entry.getValue().getName());
}
// for (int i = 0; i < map.size(); i++) { // System.out.println(map.get(i).getAge()); // } System.out.println("foreach :"); for (Map.Entry<Integer,Student> entry: map.entrySet()) { System.out.print(entry.getKey() + " = "); System.out.println(entry.getValue().getAge() + " " + entry.getValue().getName()); }
System.out.println("iterator :");
Iterator iterator=map.values().iterator();
while (iterator.hasNext()){
//System.out.println(iterator.next());
Student student=(Student)iterator.next();
System.out.println(student.getName()+" "+student.getAge());
}
}
}
```java
//运行结果
fori :
1 = 12 a
2 = 18 b
3 = 14 c
4 = 16 d
5 = 13 e
6 = 11 f
7 = 12 j
8 = 15 h
9 = 14 i
10 = 18 g
foreach :
1 = 12 a
2 = 18 b
3 = 14 c
4 = 16 d
5 = 13 e
6 = 11 f
7 = 12 j
8 = 15 h
9 = 14 i
10 = 18 g
iterator :
a 12
b 18
c 14
d 16
e 13
f 11
j 12
h 15
i 14
g 18
package day3;
/**
construct,set,get */ public class Student { private int age; private String name;
public Student(int age, String name) { this.age = age; this.name = name; }
public Student(String name) { this.name = name; }
public Student(int age) { this.age = age; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; } }
排序算法
快速排序
插入排序
选择排序
Factory
Test