下面主要是用代碼來介紹各種方法的使用
使用Lambda表達式遍歷集合
Java8爲Iterable接口新增了一個forEach默認方法,該方法所需參數的類型是一個函數式接口。
public class CollectionEach
{
public static void main(String[] args)
{
// 創建一個集合
Collection books = new HashSet();
books.add("輕量級Java EE企業應用實戰");
books.add("瘋狂Java講義");
books.add("瘋狂Android講義");
// 調用forEach()方法遍歷集合
books.forEach(obj -> System.out.println("迭代集合元素:" + obj));
}
}
使用Java8增強的Iterator遍歷集合元素
public class IteratorTest
{
public static void main(String[] args)
{
// 創建集合、添加元素的代碼與前一個程序相同
Collection books = new HashSet();
books.add("輕量級Java EE企業應用實戰");
books.add("瘋狂Java講義");
books.add("瘋狂Android講義");
// 獲取books集合對應的迭代器
Iterator it = books.iterator();
while(it.hasNext())
{
// it.next()方法返回的數據類型是Object類型,因此需要強制類型轉換
String book = (String)it.next();
System.out.println(book);
if (book.equals("瘋狂Java講義"))
{
// 從集合中刪除上一次next方法返回的元素
it.remove();
}
// 對book變量賦值,不會改變集合元素本身
book = "測試字符串"; //①
}
System.out.println(books);
}
}
使用Java8新增的Predicate操作集合
Java8爲Collection集合新增了一個removeIf(Predicate filter)方法,該方法將會批量刪除符合filter條件的所有元素。該方法需要一個Predicate對象作爲參數,Predicate也是函數式接口,因此可使用Lambda表達式作爲參數。
public class PredicateTest2
{
public static void main(String[] args)
{
// 創建books集合、爲books集合添加元素的代碼與前一個程序相同。
Collection books = new HashSet();
books.add(new String("輕量級Java EE企業應用實戰"));
books.add(new String("瘋狂Java講義"));
books.add(new String("瘋狂iOS講義"));
books.add(new String("瘋狂Ajax講義"));
books.add(new String("瘋狂Android講義"));
// 統計書名包含“瘋狂”子串的圖書數量
System.out.println(calAll(books , ele->((String)ele).contains("瘋狂")));
// 統計書名包含“Java”子串的圖書數量
System.out.println(calAll(books , ele->((String)ele).contains("Java")));
// 統計書名字符串長度大於10的圖書數量
System.out.println(calAll(books , ele->((String)ele).length() > 10));
}
public static int calAll(Collection books , Predicate p)
{
int total = 0;
for (Object obj : books)
{
// 使用Predicate的test()方法判斷該對象是否滿足Predicate指定的條件
if (p.test(obj))
{
total ++;
}
}
return total;
}
}
使用Java8新增的Stream操作集合
java8新增了Stream、IntStream、LongStream、DoubleStream等流式API,這些API代表多個支持串行和並行聚集操作的元素。
獨立使用Stream的步驟如下:
1.使用Stram或XxxStream的builder()類方法創建該Stream對應的Builder。
2.重複調用Builder的add()方法向該流中添加多個元素。
3.調用Builder的build()方法獲取對應的Stream。
4.調用Stream的聚集方法。
Stream提供了大量的方法進行聚集操作,這些方法既可以是“中間的”,也可以是“末端的”。
中間方法:中間操作允許流保持打開狀態,並允許直接調用後續方法。中間方法的返回值是另外一個流。
末端方法:末端方法是對流的最終操作。當對某個Stream執行末端方法後,該流將會被“消耗”且不再可用。
public class CollectionStream
{
public static void main(String[] args)
{
// 創建books集合、爲books集合添加元素的代碼與8.2.5小節的程序相同。
Collection books = new HashSet();
books.add(new String("輕量級Java EE企業應用實戰"));
books.add(new String("瘋狂Java講義"));
books.add(new String("瘋狂iOS講義"));
books.add(new String("瘋狂Ajax講義"));
books.add(new String("瘋狂Android講義"));
// 統計書名包含“瘋狂”子串的圖書數量
System.out.println(books.stream()
.filter(ele->((String)ele).contains("瘋狂"))
.count()); // 輸出4
// 統計書名包含“Java”子串的圖書數量
System.out.println(books.stream()
.filter(ele->((String)ele).contains("Java") )
.count()); // 輸出2
// 統計書名字符串長度大於10的圖書數量
System.out.println(books.stream()
.filter(ele->((String)ele).length() > 10)
.count()); // 輸出2
// 先調用Collection對象的stream()方法將集合轉換爲Stream,
// 再調用Stream的mapToInt()方法獲取原有的Stream對應的IntStream
books.stream().mapToInt(ele -> ((String)ele).length())
// 調用forEach()方法遍歷IntStream中每個元素
.forEach(System.out::println);// 輸出8 11 16 7 8
}
}