本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
19分41秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 步骤 1 : 引用静态方法 步骤 2 : 引用对象方法 步骤 3 : 引用容器中的对象的方法 步骤 4 : 引用构造器 步骤 5 : 练习-引用静态方法 步骤 6 : 答案-引用静态方法 步骤 7 : 练习-引用容器中的对象的方法 步骤 8 : 答案-引用容器中的对象的方法 步骤 9 : 练习-引用构造器 步骤 10 : 答案-引用构造器
首先为TestLambda添加一个静态方法:
public static boolean testHero(Hero h) { return h.hp>100 && h.damage<50; } Lambda表达式: filter(heros, h->h.hp>100 && h.damage<50); 在Lambda表达式中调用这个静态方法: filter(heros, h -> TestLambda.testHero(h) ); 调用静态方法还可以改写为: filter(heros, TestLambda::testHero); 这种方式就叫做引用静态方法 package lambda;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import charactor.Hero;
public class TestLambda {
public static void main(String[] args) {
Random r = new Random();
List<Hero> heros = new ArrayList<Hero>();
for (int i = 0; i < 5; i++) {
heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100)));
}
System.out.println("初始化后的集合:");
System.out.println(heros);
HeroChecker c = new HeroChecker() {
public boolean test(Hero h) {
return h.hp>100 && h.damage<50;
}
};
System.out.println("使用匿名类过滤");
filter(heros, c);
System.out.println("使用Lambda表达式");
filter(heros, h->h.hp>100 && h.damage<50);
System.out.println("在Lambda表达式中使用静态方法");
filter(heros, h -> TestLambda.testHero(h) );
System.out.println("直接引用静态方法");
filter(heros, TestLambda::testHero);
}
public static boolean testHero(Hero h) {
return h.hp>100 && h.damage<50;
}
private static void filter(List<Hero> heros, HeroChecker checker) {
for (Hero hero : heros) {
if (checker.test(hero))
System.out.print(hero);
}
}
}
与引用静态方法很类似,只是传递方法的时候,需要一个对象的存在
TestLambda testLambda = new TestLambda(); filter(heros, testLambda::testHero); 这种方式叫做引用对象方法 package lambda;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import charactor.Hero;
public class TestLambda {
public static void main(String[] args) {
Random r = new Random();
List<Hero> heros = new ArrayList<Hero>();
for (int i = 0; i < 5; i++) {
heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100)));
}
System.out.println("初始化后的集合:");
System.out.println(heros);
System.out.println("使用引用对象方法 的过滤结果:");
//使用类的对象方法
TestLambda testLambda = new TestLambda();
filter(heros, testLambda::testHero);
}
public boolean testHero(Hero h) {
return h.hp>100 && h.damage<50;
}
private static void filter(List<Hero> heros, HeroChecker checker) {
for (Hero hero : heros) {
if (checker.test(hero))
System.out.print(hero);
}
}
}
首先为Hero添加一个方法
public boolean matched(){ return this.hp>100 && this.damage<50; } 使用Lambda表达式 filter(heros,h-> h.hp>100 && h.damage<50 ); 在Lambda表达式中调用容器中的对象Hero的方法matched filter(heros,h-> h.matched() ); matched恰好就是容器中的对象Hero的方法,那就可以进一步改写为 filter(heros, Hero::matched); 这种方式就叫做引用容器中的对象的方法 package lambda;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import charactor.Hero;
public class TestLambda {
public static void main(String[] args) {
Random r = new Random();
List<Hero> heros = new ArrayList<Hero>();
for (int i = 0; i < 5; i++) {
heros.add(new Hero("hero " + i, r.nextInt(1000), r.nextInt(100)));
}
System.out.println("初始化后的集合:");
System.out.println(heros);
System.out.println("Lambda表达式:");
filter(heros,h-> h.hp>100 && h.damage<50 );
System.out.println("Lambda表达式中调用容器中的对象的matched方法:");
filter(heros,h-> h.matched() );
System.out.println("引用容器中对象的方法 之过滤结果:");
filter(heros, Hero::matched);
}
public boolean testHero(Hero h) {
return h.hp>100 && h.damage<50;
}
private static void filter(List<Hero> heros, HeroChecker checker) {
for (Hero hero : heros) {
if (checker.test(hero))
System.out.print(hero);
}
}
}
有的接口中的方法会返回一个对象,比如java.util.function.Supplier提供
了一个get方法,返回一个对象。 public interface Supplier<T> { T get(); } 设计一个方法,参数是这个接口 public static List getList(Supplier<List> s){ return s.get(); } 为了调用这个方法,有3种方式 第一种匿名类: Supplier<List> s = new Supplier<List>() { public List get() { return new ArrayList(); } }; List list1 = getList(s); 第二种:Lambda表达式 List list2 = getList(()->new ArrayList()); 第三种:引用构造器 List list3 = getList(ArrayList::new); package lambda;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
public class TestLambda {
public static void main(String[] args) {
Supplier<List> s = new Supplier<List>() {
public List get() {
return new ArrayList();
}
};
//匿名类
List list1 = getList(s);
//Lambda表达式
List list2 = getList(()->new ArrayList());
//引用构造器
List list3 = getList(ArrayList::new);
}
public static List getList(Supplier<List> s){
return s.get();
}
}
把比较器-Comparator 章节中的代码,使用引用静态方法的方式来实现
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
2分59秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 package collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import charactor.Hero;
public class TestCollection {
public static void main(String[] args) {
Random r =new Random();
List<Hero> heros = new ArrayList<Hero>();
for (int i = 0; i < 10; i++) {
heros.add(new Hero("hero "+ i, r.nextInt(100), r.nextInt(100)));
}
System.out.println("初始化后的集合:");
System.out.println(heros);
Collections.sort(heros,(h1,h2)->TestCollection.compare(h1, h2));
Collections.sort(heros,TestCollection::compare);
System.out.println(heros);
}
public static int compare(Hero h1, Hero h2){
return h1.hp>=h2.hp?1:-1;
}
}
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
3分58秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 package charactor;
public class Hero{
public String name;
public float hp;
public int damage;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getHp() {
return hp;
}
public void setHp(float hp) {
this.hp = hp;
}
public int getDamage() {
return damage;
}
public void setDamage(int damage) {
this.damage = damage;
}
public Hero(){
}
public Hero(String name) {
this.name =name;
}
public boolean matched(){
return this.hp>100 && this.damage<50;
}
public Hero(String name,float hp, int damage) {
this.name =name;
this.hp = hp;
this.damage = damage;
}
public int compareHero(Hero h){
return hp>=h.hp?-1:1;
}
public String toString() {
return "Hero [name=" + name + ", hp=" + hp + ", damage=" + damage + "]\r\n";
}
}
package collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
import charactor.Hero;
public class TestCollection {
public static void main(String[] args) {
Random r =new Random();
List<Hero> heros = new ArrayList<Hero>();
for (int i = 0; i < 10; i++) {
heros.add(new Hero("hero "+ i, r.nextInt(100), r.nextInt(100)));
}
System.out.println("初始化后的集合:");
System.out.println(heros);
Comparator<Hero> c = (h1,h2)-> h1.compareHero(h2) ;
Collections.sort(heros,c);
Collections.sort(heros,Hero::compareHero);
System.out.println(heros);
}
}
把比较ArrayList和LinkedList的区别这段代码,改造成引用构造器的模式。
目前的调用方式是: List<Integer> l; l = new ArrayList<>(); insertFirst(l, "ArrayList"); l = new LinkedList<>(); insertFirst(l, "LinkedList"); 改造后的调用方式将变为: insertFirst(ArrayList::new, "ArrayList"); insertFirst(LinkedList::new, "LinkedList"); package collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class TestCollection {
public static void main(String[] args) {
List<Integer> l;
l = new ArrayList<>();
insertFirst(l, "ArrayList");
l = new LinkedList<>();
insertFirst(l, "LinkedList");
}
private static void insertFirst(List<Integer> l, String type) {
int total = 1000 * 100;
final int number = 5;
long start = System.currentTimeMillis();
for (int i = 0; i < total; i++) {
l.add(0, number);
}
long end = System.currentTimeMillis();
System.out.printf("在%s 最前面插入%d条数据,总共耗时 %d 毫秒 %n", type, total, end - start);
}
}
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
9分31秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 package collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Supplier;
public class TestCollection {
public static void main(String[] args) {
insertFirst(ArrayList::new, "ArrayList");
insertFirst(LinkedList::new, "LinkedList");
}
private static void insertFirst(Supplier<List> s, String type) {
int total = 1000 * 100;
final int number = 5;
long start = System.currentTimeMillis();
List list = s.get();
for (int i = 0; i < total; i++) {
list.add(0, number);
}
long end = System.currentTimeMillis();
System.out.printf("在%s 最前面插入%d条数据,总共耗时 %d 毫秒 %n", type, total, end - start);
}
}
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2023-07-26
练习-引用容器中的对象的方法
1 个答案
wr123 跳转到问题位置 答案时间:2023-11-28 package collection;
import comparator.Hero;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
public class TestCollection {
public static void main(String[] args) {
Random r =new Random();
List<Hero> heros = new ArrayList<Hero>();
for (int i = 0; i < 10; i++) {
//通过随机值实例化hero的hp和damage
heros.add(new Hero("hero "+ i, r.nextInt(100), r.nextInt(100)));
}
System.out.println("初始化后的集合:");
System.out.println(heros);
//Collections.sort(heros);
Collections.sort(heros,Hero::CompareHero);
System.out.println("按照血量排序后的集合:");
System.out.println(heros);
Collections.sort(heros,Hero::CompareHeroDamage);
System.out.println("按照攻击力排序后的集合:");
System.out.println(heros);
}
}
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2022-06-20
答案
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2021-12-15
容器对象的matched 方法返回的是对象吗?不太理解
2021-07-27
引用构造器
2021-07-27
引用容器中的对象方法
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 28 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|