尚硅谷java8新特性视频观后感

最近公司使用了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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值