Java新增的Predicate操作集合

Java8为Collection集合新增了一个removelf(Predicate filter)方法,该方法将会批量删除符合filter条件的元素。该方法需要一个Predicate(谓词)对象作为参数,Predicate也是函数式接口,因此可以使用Lambda表达式。
如下程序示范了使用Predicate来过滤集合。

package base1;
import java.util.*;
import java.util.function.Predicate;
public class test {
    public static void main(String[] args){
        Collection books = new HashSet();
        books.add("轻量级java EE企业应用实践");
        books.add("疯狂java讲义");
        books.add("疯狂ios讲义");
        books.add("疯狂Ajax讲义");
        books.add("疯狂Android讲义");
        books.removeIf(ele->((String)ele).length()<10);
        System.out.println(books);
    }

上面程序调用了Collection集合的removelf(Predicate filter)方法批量删除集合中符合条件的元素,程序传入了一个lambda表达式作为过滤条件:所有长度小于10的字符串元素都会被删除。编译运行代码,可以看到如下输出:

[轻量级java EE企业应用实践, 疯狂Android讲义]

如下程序示范Predicate简化集合的运算。

package base1;
import java.util.*;
import java.util.function.Predicate;
public class test {
    public static void main(String[] args){
        Collection books = new HashSet();
        books.add("轻量级java EE企业应用实践");
        books.add("疯狂java讲义");
        books.add("疯狂ios讲义");
        books.add("疯狂Ajax讲义");
        books.add("疯狂Android讲义");
        System.out.println(calAll(books,ele->((String)ele).contains("疯狂")));
        System.out.println(calAll(books,ele->((String)ele).contains("java")));
        System.out.println(calAll(books,ele->((String)ele).length() > 10));
    }

    private static int calAll(Collection books, Predicate p) {
        // TODO Auto-generated method stub
        int total = 0;
        for(Object obj : books){
            if(p.test(obj)){
                total++;
            }
        }
        return total;
    }

}

运行结果:

4
2
2

该程序有如下三个统计需求:

  • 统计书名中出现”疯狂”字符串的图书数量;
  • 统计书名中出现”java”字符串的图书数量;
  • 统计书名长度大于10的图书数量。
<think>好的,用户想了解Java8新增的语法特性。我之前整理过引用内容,里面提到过Lambda表达式、函数式接口、StreamAPI、Optional类、默认方法和静态方法、新的日期时间API、方法引用这些。需要逐一解释清楚,每个特性是什么,有什么作用,最好配上代码示例。要注意引用对应的来源,比如引用[1]提到Java8的重要性和主要特性,引用[4]和[5]有接口的默认方法、Lambda表达式的例子。需要确保每个特性都有对应的引用标注。然后要生成相关问题,可能涉及这些特性的应用、与其他版本的对比、性能分析等。用户可能刚开始学Java8,需要结构清晰的回答,分点说明,代码示例要正确,符合Java8语法。可能还要注意用户是否混淆了不同版本的特性,比如Java10的本地变量类型推断,但这里只讨论Java8。检查是否有遗漏的特性,比如CompletableFuture或者Base64编码器?引用中没有提到这些,可能用户提供的资料有限,所以按照引用中的内容来组织。确保每个段落末尾的引用正确,比如Lambda部分引用[1][5]。最后的问题要围绕Java8的特性展开,比如优化Stream使用、与匿名类的区别、日期API的优势等。需要保持回答简洁明了,避免过于技术术语,适合不同层次的理解。</think>### Java 8 新增语法特性 Java 8 引入了多项革新性语法特性,显著提升了代码简洁性和功能性。以下是核心特性的详细说明: #### 1. **Lambda 表达式** Lambda 表达式允许以简洁的语法实现函数式接口,替代匿名内部类。 ```java // 传统匿名内部类 Runnable r1 = new Runnable() { @Override public void run() { System.out.println("匿名类"); } }; // Lambda 表达式 Runnable r2 = () -> System.out.println("Lambda"); ``` - **作用**:简化集合操作、事件处理等场景的代码[^1][^5]。 #### 2. **函数式接口** 函数式接口是仅包含一个抽象方法的接口,可用 `@FunctionalInterface` 标注。 ```java @FunctionalInterface interface Converter<F, T> { T convert(F from); } // 使用 Lambda 实现 Converter<String, Integer> converter = Integer::valueOf; int num = converter.convert("123"); ``` - **常见接口**:`Predicate`, `Function`, `Consumer`, `Supplier`[^1][^4]。 #### 3. **Stream API** Stream 提供声明式数据处理能力,支持链式操作。 ```java List<String> list = Arrays.asList("a", "b", "c"); list.stream() .filter(s -> s.startsWith("a")) .map(String::toUpperCase) .forEach(System.out::println); ``` - **特性**:惰性求值、并行处理(`parallelStream`)[^1][^3]。 #### 4. **Optional 类** 用于避免 `NullPointerException`,封装可能为空的对象。 ```java Optional<String> opt = Optional.ofNullable(getNullableString()); opt.ifPresent(System.out::println); // 非空时执行 String value = opt.orElse("default"); ``` - **方法**:`orElse()`, `map()`, `flatMap()`[^1][^4]。 #### 5. **接口的默认方法与静态方法** 接口可包含实现代码的默认方法和静态方法。 ```java interface Vehicle { default void print() { System.out.println("默认方法"); } static void honk() { System.out.println("静态方法"); } } ``` - **作用**:支持接口演进,避免破坏现有实现类[^1][^4]。 #### 6. **新的日期时间 API (`java.time`)** 替代易错的 `Date` 和 `Calendar`,提供不可变且线程安全的类。 ```java LocalDate date = LocalDate.now(); LocalDateTime datetime = LocalDateTime.of(2023, Month.JANUARY, 1, 10, 0); Duration duration = Duration.between(start, end); ``` - **核心类**:`LocalDate`, `LocalTime`, `ZonedDateTime`, `Period`[^1][^3]。 #### 7. **方法引用** 简化 Lambda 表达式,直接引用已有方法。 ```java List<String> names = Arrays.asList("Alice", "Bob"); names.forEach(System.out::println); // 实例方法引用 Converter<String, Integer> converter = Integer::valueOf; // 静态方法引用 ``` - **类型**:静态方法、实例方法、构造方法引用[^1][^5]。 ### 性能与设计影响 - **Lambda 底层实现**:通过 `invokedynamic` 指令优化,减少匿名类的字节码开销[^5]。 - **Stream 并行处理**:利用多核处理器提升大数据集处理效率[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值