maven项目中的pom文件的依赖有先后顺序,被依赖的jar放到前面 ,否则会报错
maven工程中的依赖jar包
1.间接依赖路径最短优先
一个项目test依赖了a和b两个jar包。其中a-b-c1.0 , d-e-f-c1.1 。由于c1.0路径最短,所以项目test最后使用的是c1.0。
2.pom文件中申明顺序优先
有人就问了如果 a-b-c1.0 , d-e-c1.1 这样路径都一样怎么办?其实maven的作者也没那么傻,会以在pom文件中申明的顺序那选,如果pom文件中先申明了d再申明了a,test项目最后依赖的会是c1.1
所以maven依赖原则总结起来就两条:路径最短,申明顺序其次。
遇到冲突的时候第一步要找到maven加载的到时是什么版本的jar包。通过mvn dependency:tree查看依赖树。
exclusions>com.ibm.icu icu4j
map
举例说明,假设我们希望筛选出所有专业为计算机科学的学生姓名,那么我们可以在filter筛选的基础之上,通过map将学生实体映射成为学生姓名字符串,具体实现如下:
Listnames = students.stream() .filter(student -> "计算机科学".equals(student.getMajor())) .map(Student::getName).collect(Collectors.toList());
除了上面这类基础的map,java8还提供了mapToDouble(ToDoubleFunction super T> mapper)
,mapToInt(ToIntFunction super T> mapper)
,mapToLong(ToLongFunction super T> mapper)
,这些映射分别返回对应类型的流,java8为这些流设定了一些特殊的操作,比如我们希望计算所有专业为计算机科学学生的年龄之和,那么我们可以实现如下:
int totalAge = students.stream() .filter(student -> "计算机科学".equals(student.getMajor())) .mapToInt(Student::getAge).sum();
通过将Student按照年龄直接映射为IntStream
,我们可以直接调用提供的sum()
方法来达到目的,此外使用这些数值流的好处还在于可以避免jvm装箱操作所带来的性能消耗。
flatMap
flatMap与map的区别在于 flatMap是将一个流中的每个值都转成一个个流,然后再将这些流扁平化成为一个流 。举例说明,假设我们有一个字符串数组String[] strs = {"java8", "is", "easy", "to", "use"};
,我们希望输出构成这一数组的所有非重复字符,那么我们可能首先会想到如下实现:
ListdistinctStrs = Arrays.stream(strs) .map(str -> str.split("")) // 映射成为Stream .distinct() .collect(Collectors.toList());
在执行map操作以后,我们得到是一个包含多个字符串(构成一个字符串的字符数组)的流,此时执行distinct操作是基于在这些字符串数组之间的对比,所以达不到我们希望的目的,此时的输出为:
[j, a, v, a, 8]
[i, s]
[e, a, s, y]
[t, o]
[u, s, e]
distinct只有对于一个包含多个字符的流进行操作才能达到我们的目的,即对Stream
进行操作。此时flatMap就可以达到我们的目的:
ListdistinctStrs = Arrays.stream(strs) .map(str -> str.split("")) // 映射成为Stream .flatMap(Arrays::stream) // 扁平化为Stream .distinct() .collect(Collectors.toList());
flatMap将由map映射得到的Stream
,转换成由各个字符串数组映射成的流Stream
,再将这些小的流扁平化成为一个由所有字符串构成的大流Steam
,从而能够达到我们的目的。
与map类似,flatMap也提供了针对特定类型的映射操作:flatMapToDouble(Function super T,? extends DoubleStream> mapper)
,flatMapToInt(Function super T,? extends IntStream> mapper)
,flatMapToLong(Function super T,? extends LongStream> mapper)
。
map
举例说明,假设我们希望筛选出所有专业为计算机科学的学生姓名,那么我们可以在filter筛选的基础之上,通过map将学生实体映射成为学生姓名字符串,具体实现如下:
Listnames = students.stream() .filter(student -> "计算机科学".equals(student.getMajor())) .map(Student::getName).collect(Collectors.toList());
除了上面这类基础的map,java8还提供了mapToDouble(ToDoubleFunction super T> mapper)
,mapToInt(ToIntFunction super T> mapper)
,mapToLong(ToLongFunction super T> mapper)
,这些映射分别返回对应类型的流,java8为这些流设定了一些特殊的操作,比如我们希望计算所有专业为计算机科学学生的年龄之和,那么我们可以实现如下:
int totalAge = students.stream() .filter(student -> "计算机科学".equals(student.getMajor())) .mapToInt(Student::getAge).sum();
通过将Student按照年龄直接映射为IntStream
,我们可以直接调用提供的sum()
方法来达到目的,此外使用这些数值流的好处还在于可以避免jvm装箱操作所带来的性能消耗。
flatMap
flatMap与map的区别在于 flatMap是将一个流中的每个值都转成一个个流,然后再将这些流扁平化成为一个流 。举例说明,假设我们有一个字符串数组String[] strs = {"java8", "is", "easy", "to", "use"};
,我们希望输出构成这一数组的所有非重复字符,那么我们可能首先会想到如下实现:
ListdistinctStrs = Arrays.stream(strs) .map(str -> str.split("")) // 映射成为Stream .distinct() .collect(Collectors.toList());
在执行map操作以后,我们得到是一个包含多个字符串(构成一个字符串的字符数组)的流,此时执行distinct操作是基于在这些字符串数组之间的对比,所以达不到我们希望的目的,此时的输出为:
[j, a, v, a, 8]
[i, s]
[e, a, s, y]
[t, o]
[u, s, e]
distinct只有对于一个包含多个字符的流进行操作才能达到我们的目的,即对Stream
进行操作。此时flatMap就可以达到我们的目的:
ListdistinctStrs = Arrays.stream(strs) .map(str -> str.split("")) // 映射成为Stream .flatMap(Arrays::stream) // 扁平化为Stream .distinct() .collect(Collectors.toList());
flatMap将由map映射得到的Stream
,转换成由各个字符串数组映射成的流Stream
,再将这些小的流扁平化成为一个由所有字符串构成的大流Steam
,从而能够达到我们的目的。
与map类似,flatMap也提供了针对特定类型的映射操作:flatMapToDouble(Function super T,? extends DoubleStream> mapper)
,flatMapToInt(Function super T,? extends IntStream> mapper)
,flatMapToLong(Function super T,? extends LongStream> mapper)
。