当前位置: 首页 > news >正文

做教育行业营销类型的网站app网站建站系统策划方案

做教育行业营销类型的网站,app网站建站系统策划方案,WordPress百度收录内容,如何用ai给网站做logoArrayList 中的 removeIf 方法是 Java 8 中引入的集合操作方法之一。它使用了 Predicate 接口作为参数#xff0c;以便根据指定的条件移除集合中的元素。以下是对 removeIf 方法入参设计的详细解释#xff1a; Predicate 接口 Predicate 是一个函数式接口#xff0c;定义了… ArrayList 中的 removeIf 方法是 Java 8 中引入的集合操作方法之一。它使用了 Predicate 接口作为参数以便根据指定的条件移除集合中的元素。以下是对 removeIf 方法入参设计的详细解释 Predicate 接口 Predicate 是一个函数式接口定义了一个 test 方法用于接收一个参数并返回一个布尔值。它的签名如下 FunctionalInterface public interface PredicateT {boolean test(T t); }Predicate 接口通常用于对输入参数进行条件测试。结合 removeIf 方法这个接口被用来判断集合中的元素是否应该被移除。 removeIf 方法的签名 在 ArrayList 类中removeIf 方法的签名如下 public boolean removeIf(Predicate? super E filter)其中E 是集合的泛型类型参数而 Predicate? super E 表示可以接受 E 类型或其父类型的参数。 设计理由 灵活性 使用 Predicate? super E 作为参数使得 removeIf 方法可以接受针对元素类型及其父类型的条件。这种设计提供了更大的灵活性。例如如果有一个 ArrayListNumber可以传入 PredicateObject因为 Object 是 Number 的父类型。 函数式编程 Java 8 引入了函数式编程的概念允许使用 lambda 表达式和方法引用。这使得编写条件测试的代码变得更加简洁和直观。例如可以使用 lambda 表达式来移除所有负数 ArrayListInteger list new ArrayList(Arrays.asList(1, -2, 3, -4, 5)); list.removeIf(n - n 0);类型安全 泛型确保了 Predicate 的参数类型与集合元素类型一致从而在编译时提供类型安全。这样可以避免传递错误类型的条件测试导致运行时错误。 removeIf 方法的实现 removeIf 方法的内部实现使用了迭代器来遍历集合并应用 Predicate 进行条件测试。以下是简化的实现 public boolean removeIf(Predicate? super E filter) {Objects.requireNonNull(filter);boolean removed false;final IteratorE each iterator();while (each.hasNext()) {if (filter.test(each.next())) {each.remove();removed true;}}return removed; }在这个实现中 检查 filter 是否为 null。使用迭代器遍历集合。对每个元素应用 Predicate 进行测试。如果 Predicate 返回 true则移除该元素。 使用示例 以下是一些使用 removeIf 方法的示例 移除负数 ArrayListInteger numbers new ArrayList(Arrays.asList(1, -2, 3, -4, 5)); numbers.removeIf(n - n 0); System.out.println(numbers); // 输出[1, 3, 5]移除空字符串 ArrayListString strings new ArrayList(Arrays.asList(apple, , banana, , cherry)); strings.removeIf(String::isEmpty); System.out.println(strings); // 输出[apple, , banana, cherry]细品一下 removeIf() 方法入参设计 在 ArrayList 的 removeIf 方法中使用 Predicate? super E 而不是 PredicateE 是为了增加方法的灵活性和通用性。具体来说这与 Java 泛型的协变和逆变有关。以下是详细的解释 泛型的协变和逆变 协变Covariance允许使用某种类型及其子类型。用 ? extends E 表示。逆变Contravariance允许使用某种类型及其超类型。用 ? super E 表示。不变Invariance只能使用某种特定类型。用 E 表示。 在 removeIf 方法中Predicate? super E 表示这个 Predicate 可以接受类型 E 或 E 的任何超类型。这是一种逆变用于增加灵活性。 为什么使用 ? super E 而不是 E 灵活性 使用 ? super E 可以让 Predicate 接受类型 E 或 E 的父类型的对象从而增加了方法的灵活性。例如如果 E 是 Integer那么 Predicate? super Integer 可以接受 Integer 及其父类 Number 和 Object 的 Predicate。 这意味着你可以传入更多种类的 Predicate而不仅仅是严格匹配 E 的 Predicate。例如 ListInteger list new ArrayList(Arrays.asList(1, 2, 3)); PredicateObject isEven obj - obj instanceof Integer (Integer) obj % 2 0; list.removeIf(isEven); // 使用 PredicateObject 也可以兼容性 假设你有一个处理父类 Number 的 Predicate比如 PredicateNumber isPositive num - num.doubleValue() 0;这个 Predicate 可以传递给 ArrayListInteger 的 removeIf 方法因为 Number 是 Integer 的超类型。如果 removeIf 方法只接受 PredicateE那么你只能传入 PredicateInteger。 类型安全 使用 ? super E 仍然确保了类型安全因为在调用 removeIf 方法时传入的 Predicate 需要能够处理类型 E。例如对于 ArrayListInteger传入的 Predicate 需要能够处理 Integer 及其超类型。 注意 ? 无界通配符主要用于不关心元素类型的操作基本都是公共类操作。 例子 使用 PredicateE 如果 removeIf 只接受 PredicateE那么只能传入 PredicateInteger ListInteger list new ArrayList(Arrays.asList(1, 2, 3)); PredicateInteger isEven n - n % 2 0; list.removeIf(isEven); // 正常工作但是不能传入 PredicateNumber PredicateNumber isPositive num - num.doubleValue() 0; // list.removeIf(isPositive); // 编译错误使用 Predicate? super E 使用 Predicate? super E可以传入 PredicateInteger 或 PredicateNumber ListInteger list new ArrayList(Arrays.asList(1, 2, 3)); PredicateInteger isEven n - n % 2 0; PredicateNumber isPositive num - num.doubleValue() 0; list.removeIf(isEven); // 正常工作 list.removeIf(isPositive); // 也能正常工作简而言之 ArrayList 中 removeIf 方法使用 Predicate? super E 而不是 PredicateE 是为了增加方法的灵活性和通用性。通过允许传入类型 E 或其超类型的 PredicateremoveIf 方法变得更加通用和灵活同时仍然保持类型安全。这样的设计使得在处理集合元素时可以应用更多种类的条件增加了代码的可重用性和灵活性。 再举例说明逆变的用法 逆变Contravariance在 Java 泛型中通过下界通配符? super T来实现。下界通配符允许使用某个类型及其父类型这对于需要向集合中添加元素或处理泛型对象的写操作特别有用。以下是一些具体的例子来说明逆变的用法。 1. 使用逆变来添加元素到集合中 逆变可以确保能够向集合中添加类型 T 或 T 的子类型的元素。 例子 1向集合中添加元素 import java.util.List; import java.util.ArrayList;public class CollectionUtils {public static void addAnimals(List? super Dog list) {list.add(new Dog());list.add(new Puppy());// list.add(new Animal()); // 编译错误Animal 不是 Dog 的子类}public static void main(String[] args) {ListAnimal animalList new ArrayList();addAnimals(animalList);for (Object obj : animalList) {System.out.println(obj.getClass().getSimpleName());}} }class Animal {} class Dog extends Animal {} class Puppy extends Dog {}在这个例子中addAnimals 方法接受一个 List? super Dog 类型的参数这意味着它可以接受 Dog 类型及其超类型如 Animal 和 Object的列表并向其中添加 Dog 及其子类型如 Puppy的元素。 2. 处理通用的数据结构 逆变可以用于处理具有多种元素类型的数据结构比如在比较器中。 例子 2使用逆变来编写通用比较器 import java.util.List; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator;public class SortingUtils {public static T void sortList(ListT list, Comparator? super T comparator) {Collections.sort(list, comparator);}public static void main(String[] args) {ListInteger intList new ArrayList();intList.add(3);intList.add(1);intList.add(4);intList.add(1);intList.add(5);ComparatorNumber numberComparator (Number n1, Number n2) - Double.compare(n1.doubleValue(), n2.doubleValue());sortList(intList, numberComparator);System.out.println(intList); // 输出: [1, 1, 3, 4, 5]} }在这个例子中sortList 方法接受一个 Comparator? super T 类型的参数这意味着它可以接受 T 类型及其超类型的比较器从而使得比较器更加通用和灵活。 3. 使用逆变来编写通用的消费操作 逆变也可以用于消费操作例如在处理不同类型的消费者时。 例子 3使用逆变来编写通用的消费者 import java.util.List; import java.util.ArrayList; import java.util.function.Consumer;public class ConsumerUtils {public static T void processElements(ListT list, Consumer? super T consumer) {for (T element : list) {consumer.accept(element);}}public static void main(String[] args) {ListDog dogList new ArrayList();dogList.add(new Dog());dogList.add(new Puppy());ConsumerAnimal animalConsumer animal - System.out.println(animal.getClass().getSimpleName());processElements(dogList, animalConsumer); // 输出: Dog Puppy} }class Animal {} class Dog extends Animal {} class Puppy extends Dog {}在这个例子中processElements 方法接受一个 Consumer? super T 类型的参数这意味着它可以接受 T 类型及其超类型的消费者从而使得消费者更加通用和灵活。 总结(添加、通用/公用、消费类型参数使用逆变) 逆变通过下界通配符? super T允许使用某个类型 T 及其父类型主要用于写操作。使用逆变可以 添加元素确保可以向集合中添加类型 T 及其子类型的元素。通用操作处理具有多种元素类型的数据结构使得操作更加灵活和通用。消费操作处理不同类型的消费者使得消费者更加通用和灵活。 通过这些例子可以看到逆变在编写通用和灵活的代码中发挥了重要作用确保类型安全的同时增加了代码的灵活性。
http://www.hkea.cn/news/14349215/

相关文章:

  • 小昆山网站建设wordpress做账号登录
  • 宁波网站制作网站做网站怎么让字居右
  • 广州建网站要多少钱爱站攻略
  • 环保行业网站怎么做企业网站建设的方式有哪些方式
  • 做传感器的网站做网站头视频
  • destoon 手机网站模板怎么做网页新闻
  • 惠阳网站建设wordpress 投稿图片
  • 公司网站框架花生壳申请了域名 怎么做网站
  • 中国空间站最新消息新闻杭州公司注册地址可以是住宅吗
  • asp技校网站云服务器小网站制作
  • 盐城市住房城乡建设网站做pc端网站好么
  • 怎么做文化传播公司网站东阳做网站的公司
  • 免费做头像网站有哪些网站运营与维护
  • 优秀电商网站搜索引擎营销的内容和层次有哪些
  • wordpress建站位置山东城市建设职业学院图书馆网站
  • 精品课程网站源码做翻译的网站
  • 沈阳哪家做网站最好网站开发工资怎么样
  • 和田知名网站建设企业软件平台设计方案
  • 工信部网站备案举报最好的seo外包
  • 深圳惠州网站建设网迎客 网站建设
  • 英文二手汽车网站建设关键词排名优化是什么意思
  • 手机网站优化怎么做创建网页教程
  • 中国建设银行官方招聘网站安卓开发教程视频
  • APP客户端网站建设wordpress 优秀的博客主题简洁
  • 建设网站前需要的市场分析网站建设相关话术
  • 公司做网站好不好注册一个公司全部流程
  • 国外黑色背景网站民宿可以在哪些网站做推广
  • wordpress更改主站点阜宁网站制作收费标准
  • 会展设计合同范本seo关键词排行优化教程
  • HTML5做网站例子知名网站设计欣赏