最近公司使用了java8的新特性,特地找了尚硅谷李贺飞老师的教学视频,然后根据一点记忆,模仿着写了一部分代码。从最初
的普通的代码 到 策略模式 到 策略模式匿名内部类 到 lambda表达式 到 stream api 。具体的解释在代码中。
package cn.itouchtv.java8;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Test {
private List<News> newsList = Arrays.asList(
new News(10,5,"a","aaaa"),
new News(12,4,"b","bbbb"),
new News(14,3,"c","cccc"),
new News(19,6,"d","dddd")
);
/**
* 1、返回viewCnt>10的记录
* 2、返回onlineCnt> 5 的记录
* 3、返回title == a的记录
* 4、返回content == cccc的记录
*/
/**
* 第一种方法是有多少种就返回多少种方法,这里只写出一种,其他写法类似
*
*/
public List<News> getViewGt10(List<News> newsList){
List<News> result = new ArrayList<>();
if(newsList != null && !newsList.isEmpty()){
for(News news : newsList){
if(news.getViewCnt() > 10){
result.add(news);
}
}
}
return result;
}
@org.junit.Test
public void test1(){
List<News> result = getViewGt10(newsList);
for(News news : result){
System.out.println(news);
}
}
/**
* 打印結果:
News{viewCnt=12, onlineCnt=4, title='b', content='bbbb'}
News{viewCnt=14, onlineCnt=3, title='c', content='cccc'}
News{viewCnt=19, onlineCnt=6, title='d', content='dddd'}
缺点:
代码多,没做到复用代码。
*/
/**********************************************************************************************************/
/**
* 第二种方法是通过策略模式进行过滤,首先是定义一个策略接口。NewsStrategy
* 然后让需要为每一个要求实现一个判断的策略,进行过滤。这里也只举例一个
* 比如我实现上述的 2 要求
*/
public List<News> getNews(List<News> newsList,NewsStrategy newsStrategy){
List<News> result = new ArrayList<>();
if(newsList != null && !newsList.isEmpty()){
for(News news : newsList){
if(newsStrategy.test(news)){
result.add(news);
}
}
}
return result;
}
@org.junit.Test
public void test2(){
List<News> result = getNews(newsList,new NewsOnlineCntGt5());
for(News news : result){
System.out.println(news);
}
}
/**
打印结果:
News{viewCnt=19, onlineCnt=6, title='d', content='dddd'}
缺点: 每次完成一个要求都是要添加一个类,也是比较麻烦
*/
/**********************************************************************************************/
/**
* 第三种也是使用策略模式,不过这里使用匿名内部类的方式实现:还是要用到策略接口。NewsStrategy
* 这里我们完成第三个要求
*/
@org.junit.Test
public void test3(){
List<News> result = getNews(newsList, new NewsStrategy() {
@Override
public boolean test(News t) {
return "a".equals(t.getTitle());
}
});
for(News news : result){
System.out.println(news);
}
}
/**
* 返回结果:
News{viewCnt=10, onlineCnt=5, title='a', content='aaaa'}
结论:
其实这个跟用实际的实现类是一样的,不过可以减少一个类而且
同时这种方式不太好理解,如果刚学java的话
*/
/**************************************************************/
/**
* 第四种方式使用lambda表达式,这里完成第四个要求
*/
@org.junit.Test
public void test4(){
List<News> result = getNews(newsList,x->{
return "cccc".equals(x.getContent());
});
for(News news : result){
System.out.println(news);
}
}
/**
* 结果:
News{viewCnt=14, onlineCnt=3, title='c', content='cccc'}
结论:
这种方式代码量少,方便,但是可以发现是不太好理解的。
不过用多了后,会发现挺方便的,然而不可避免的还是要用到
getNews方法,同时不太好debug
*/
/************************************************************************/
/**
* 第五种方法,使用stream api,这种方法很方便,但是也是不太好理解和debug
* 这里还是完成第四个要求
*
*/
@org.junit.Test
public void test5(){
newsList.stream()
.filter(x->{
return "cccc".equals(x.getContent());
}).forEach(x->{
System.out.println(x);
});
}
/**
* 返回结果:
News{viewCnt=14, onlineCnt=3, title='c', content='cccc'}
结论;
发现没,啥都不用,直接就过滤打印了。同样不好理解和debug
这个其实的很方便的。
*/
}
interface NewsStrategy{
//策略方法,用于判断是否满足条件
/**
*
interface Strategy<T>{
//策略方法,用于判断是否满足条件
//这里是为了更通用一点所以使用了泛型,其实这里也可以只传News而不用T
boolean test(T t);
}
*/
boolean test(News t);
}
class NewsOnlineCntGt5 implements NewsStrategy{
@Override
public boolean test(News news) {
return news.getOnlineCnt() > 5;
}
}