持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天
java集合大致可以分为set,List,Queue,Map四种体系。
-
其中set代表无序,不可重复的集合。
-
List代表有序,重合的集合。
-
Map代表具有映射关系的集合。
-
Queue体系集合,代表一种队列集合。
图二显示的是Map体系的继承树,所有Map实现类用于保存具有映射关系的数据。 他们的实质都是保存的数据都是key-value对(例:数学-80分,每项成绩都有两项组成)。
Map里的key是不可以重复的,所以如果需要调用Map里面的数据的话,总是根据Map的key来获取的。
java11增强的Collection和Iterator接口
下面是实例演示:
mport java.util.ArrayList;
import java.util.HashSet;
public class CollectionTest {
public static void main(String[] args) {
var c=new ArrayList<>();
c.add("apple");
c.add(7);
System.out.println(c.size());
c.remove("apple");
System.out.println(c.size());
System.out.println("c集合是否包含apple"+c.contains("apple"));
c.add("banana");
System.out.println("c包含的元素有"+c);
var books=new HashSet<>();
books.add("one");
books.add("two");
System.out.println("c集合是否完全包含books集合?"+c.containsAll(books));
System.out.println("c集合里的所有元素"+c);
c.clear();
System.out.println("c集合里的所有元素"+c);
books.retainAll(c);
System.out.println("books里面包含的元素有"+books);
}
}
使用Lambda表达式历遍集合
lambda是Collection接口的父接口,所以Collection集合可以直接调用该方法。
public class CollectionTest {
public static void main(String[] args) {
var books=new HashSet<>();
books.add("apple");
books.add("banana");
books.add("we");
books.forEach(o -> System.out.println(o));
}
}
使用Iterator来历遍集合元素
Iterator主要用于遍历,即迭代访问Collection里面的元素,Iterator对象也被称作迭代器。
Iterator接口里定义了四个方法:
-
boolean hasNext():如果元素被遍历完了,则返回false。
-
Object next():返回集合里的下一个元素
-
void remove():删除集合里上一次next方法返回的元素
-
VOid forEachRemaining(Consummer action):可以使用Lambda表达式来遍历集合元素。
public class CollectionTest {
public static void main(String[] args) {
var books = new HashSet<>();
books.add("apple");
books.add("banana");
books.add("we");
var it = books.iterator();
while (it.hasNext()) {
var book = (String) it.next();
System.out.println(book);
if (book.equals("apple")) {
it.remove();
}
// book="test";#
}
System.out.println(books);
}
}
注意
当使用Iterator对集合元素进行迭代的时候,Iterator并不会把集合元素本身传给迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值不会对集合变量有任何影响。
使用Predicate来操作集合
- removeIf(Predicate filter)
例如,如果程序中需要统计或者删除含某些特定标志的元素,则可以按照下面的程序。
public class CollectionTest {
public static void main(String[] args) {
var books = new HashSet<>();
books.add("安卓牛逼");
books.add("苹果牛逼");
books.add("鸿蒙牛逼");
books.add("腾讯666");
books.add("nikesly");
// books.removeIf(ele -> ((String) ele).length() > 4);
// System.out.println(books);
printAll(books, ele -> ((String) ele).contains("牛逼"));
}
public static void printAll(Collection books, Predicate p) {
for (var obj : books) {
if (p.test(obj)) {
System.out.println(obj);
}
}
}
}
使用Stream来操作集合
在JAVA中,涉及到对数组、Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。
Stream初相识
可以把Stream流操作分为三种类型:
- 创建Stream
- Stream中间处理
- 终止Stream
每个Stream管道都包含很多API方法
- 开始管道
主要负责新建一个新的stream流。
- 中间管道
负责对Stream进行处理操作,并返回一个新的Stream对象,中间管道操作可以进行叠加。
- 终止管道
通过终止管道操作后,Stream流会结束,最后可能执行某些逻辑处理,或者是按照要求返回某些执行后的结果数据。
接下来放上一段代码,第一段是终止管道
public class StreamTest {
public static void main(String[] args) {
// 1. var is = IntStream.builder()
// .add(21)
// .add(10)
// .add(20)
// .add(20)
// .build();
// System.out.println("is的所有元素的最大值是" + is.max());
// System.out.println("is的所有元素的最小值是" + is.min());
// System.out.println("is的所有元素的总和是" + is.sum());
// System.out.println("is的所有元素的总数是" + is.count());
// System.out.println("is的所有元素的平均值是" + is.average());
// System.out.println("is的所有元素的平方是否大于20" + is.allMatch(ele->ele*ele>20));
// System.out.println("is的中的元素的平方是否存在大于20" + is.anyMatch(ele->ele*ele>20));
// System.out.println("is的中的元素的平方是否存在大于20" + is.anyMatch(ele->ele*ele>20));
// var newis=is.map(ele->ele*2);
// newis.forEach(System.out::println);
// 先切割句子,获取具体的单词信息
// 2...... String sentence="i am the bossssssssssssss";
// String[] words = sentence.split(" ");
// List<String> wordList = new ArrayList<>();
// // 循环判断单词的长度,先过滤出符合长度要求的单词
// for (String word : words) {
// if (word.length() > 5) {
// wordList.add(word);
// }
// }
// // 对符合条件的列表按照长度进行排序
// wordList.sort((o1, o2) -> o2.length() - o1.length());
// // 判断list结果长度,如果大于3则截取前三个数据的子list返回
// if (wordList.size() > 3) {
// wordList = wordList.subList(0, 3);
// }
// System.out.println(wordList);;
}
}