package myStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class myStream {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>();
list.add(new Person(1, "haha"));
list.add(new Person(2, "rere"));
list.add(new Person(3, "fefe"));
//Map<Integer, String> mapp = list.stream().collect(Collectors.toMap(Person::getId,p->p.getName()+"abc",(x,y)->(x.equals("hahaabc")?x:y)));
Map<Integer,Person> mapp = list.stream().collect(Collectors.toMap(k->k.getId()+1,Function.identity()));
System.out.println(mapp);
System.out.println(mapp.get(2).getName());
Map<Integer, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));
System.out.println(map);
}
}
class Person {
private Integer id;
private String name;
public Person(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
1.首先定义一个Person类
2.构造个List,存储Person实例
3.通过toMap方法将map的value增加”abc“标识,如果key重复就用第一个。
4.通过toMap方法将map的key都增加1.
1.首先看tomap的定义
public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper) {
return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}
toMap的参数一共三个,第一个是keyMapper,是说明key怎么存储 第二个valueMapper说明value怎么存储。第三个是为了如果key有重复我们应该以哪个为准。
2.toMap的返回类型时 <T,?,Map<k.U>>。返回给collect。我们看下collect的定义
<R, A> R collect(Collector<? super T, A, R> collector);
3.第三个参数R也就是collect要返回的类型。剩下的T和A分别定的上面的T和? 4.接下来我们就能够确定了Map的类型其实就是前面返回的R。而R是我们在toMap中已经规定好的类型。也就是<Integer,String>
static <T> Function<T, T> identity() {
return t -> t;
}
- 我们看到toMap中的前两参数都是Function。所以我们可以用函数式编程的思想,将Functin.identity()理解为传入什么值就输出什么值,也就是说什么都不变。