JAVA 作业 用JAVA8新特性 获取新浪财经股票

参考:

https://my.oschina.net/u/154628/blog/508042

https://www.programcreek.com/java-api-examples/index.php?api=java.util.DoubleSummaryStatistics

https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

代码:

package homework01;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 *
 * @author yiwzhong
 */
public class StockFinance {

    public static final List<String> shStocks = Arrays.asList(
            "sh601001", "sh601002", "sh601003",
            "sh601005", "sh601006", "sh601007", "sh601008",
            "sh601009", "sh601012");

    public static final List<String> szStocks = Arrays.asList(
            "sz002315", "sz002316", "sz002317");

    public static String getStock(final String strUrl, final String code, String opt) {
        try {
            final URL url;
            url = new URL(strUrl + code + opt);
            final BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(),"GBK"));
            //reader.lines().forEach(System.out::println);
            return reader.lines().findFirst().orElse("");
        } catch(Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    public static void template() {
        final String chnUrl = "http://hq.sinajs.cn/list=";

        System.out.println("\nChina Shanghai Stocks:");
        StockFinance.shStocks
                .stream()
                .map( name -> getStock(chnUrl, name, ""))
                .map(s -> { String[] datas = s.split(","); return datas[1];})
                .forEach(System.out::println);

        System.out.println("\nChina Shenzhen Stocks:");
        StockFinance.szStocks
                .stream()
                .map( name -> getStock(chnUrl, name, ""))
                .sorted((s1,s2)->{s1 = s1.split(",")[1];
                    s2 = s2.split(",")[1];
                    return Double.valueOf(s1).compareTo( Double.valueOf(s2));})
                .forEach(System.out::println);
    }

    /**
     * 自动扩充股票
     * @param startStockPosition 股票起始编号
     * @param addStocksNum 添加的股票数
     * @param preStocksName 股票前缀,比如sh,sz
     * @return
     */
    public static ArrayList<String> addStocks(String startStockPosition, int addStocksNum, String preStocksName){
        //最大查找次数
        final int maxFind = 100 + addStocksNum;
        final String chnUrl = "http://hq.sinajs.cn/list=";
        ArrayList<String> curStocks = new ArrayList<>();
        int start = Integer.parseInt(startStockPosition);
        //编号补零
        Function<Integer,String> handler = (x)->{
            int tmp = x,digit = 0;
            StringBuilder stringBuilder = new StringBuilder();
            while(tmp>0){tmp/=10;++digit;}
            digit = 6 - digit;
            while(digit>0){--digit;stringBuilder.append("0");}
            return stringBuilder.toString() + x.toString();
        };
        //添加股票
        for(int i = 1;i<=addStocksNum;++i){
            String stockName = preStocksName + "" + handler.apply(i+ start);
            String stock = getStock(chnUrl, stockName, "");
            if (stock.indexOf(',') == -1) {
                if(addStocksNum < maxFind)
                    ++addStocksNum;//如果该股票不存在则继续查找
            }else{
                curStocks.add(stock);
            }
        }
        return curStocks;
    }

    public static void hw3_1() {
        System.out.println("---------------Homework 3 - 1:---------------");
        final String chnUrl = "http://hq.sinajs.cn/list=";
        
        ArrayList<String> curStocks = addStocks("601001",21,"sh");
        System.out.println("\nChina Shenzhen Stocks:");
            DoubleSummaryStatistics doubleSummaryStatistics = curStocks.stream()
                 .mapToDouble((s1)->{
                    String[] t1 = s1.split(",");
                    String a1 = t1[1], a2 = t1[2];
                    Double dis1 = Math.abs(Double.valueOf(a1) - Double.valueOf(a2));
                    return dis1;
                 }).summaryStatistics();
        double max = doubleSummaryStatistics.getMax();
        double min = doubleSummaryStatistics.getMin();
        double avg = doubleSummaryStatistics.getAverage();
        System.out.println("max:" + max);
        System.out.println("min:" + min);
        System.out.println("avg:" + avg);
    }

    public static void hw3_2() {
        System.out.println("---------------Homework 3 - 2:---------------");
        ArrayList<String> curStocks = addStocks("002315",21,"sz");
        final String chnUrl = "http://hq.sinajs.cn/list=";

        System.out.println("\nChina Shanghai Stocks:");
        curStocks.stream()
                .sorted((s1,s2)->{
                    String[] t1 = s1.split(",");
                    String a1 = t1[1], a2 = t1[2];
                    String[] t2 = s2.split(",");
                    String b1 = t2[1], b2 = t2[2];
                    Double dis1 = Math.abs(Double.valueOf(a1) - Double.valueOf(a2)),
                            dis2 = Math.abs(Double.valueOf(b1) - Double.valueOf(b2));
                    return dis1.compareTo(dis2);})
                .forEach(System.out::println);
    }


    public static void main(String[] args) {
        StockFinance.template();
        StockFinance.hw3_1();
        StockFinance.hw3_2();
    }
}

 

posted @ 2019-03-20 20:57  zz2108828  阅读(801)  评论(0)    收藏  举报