源码

java8之Option

霸气de小男生 提交于 2019-12-05 04:03:35
转载出处: https://www.cnblogs.com/rjzheng/p/9163246.html 引言 在文章的开头,先说下NPE问题, NPE问题就是,我们在开发中经常碰到的NullPointerException .假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user.getAddress().getProvince(); 这种写法,在user为null时,是有可能报NullPointerException异常的。为了解决这个问题,于是采用下面的写法 if(user!=null){ Address address = user.getAddress(); if(address!=null){ String province = address.getProvince(); } } 这种写法是比较丑陋的,为了避免上述丑陋的写法,让丑陋的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的正文部分进行详细说明 API介绍 先介绍一下API,与其他文章不同的是,本文采取类比的方式来讲,同时结合源码。而不像其他文章一样,一个个API罗列出来,让人找不到重点。 (1)Optional(T value),empty(),of(T value),ofNullable(T value) 这四个函数之间具有相关性,因此放在一组进行记忆。

Objective-C 源码(四) 再次看 Method Swizzling

主宰稳场 提交于 2019-12-05 03:59:08
Method Swizzling 的原理 先打开 objc-private.h 文件 在 235行可以看到 Method的定义: typedef struct method_t *Method; 然后在 objc-runtime-new.h 文件中第82行可以看到: struct method_t { SEL name; const char *types; IMP imp; struct SortBySELAddress : public std::binary_function<const method_t&, const method_t&, bool> { bool operator() (const method_t& lhs, const method_t& rhs) { return lhs.name < rhs.name; } }; }; 从本质上讲:它就是struct method_t 类型的执行,包括了3个成员变量和一个成员函数: name:表示的是方法的名称,用于唯一标示该方法,比如@selector(viewWillAppear:); types:标示的是方法的返回值和参数类型; imp:是一个函数指针,指向方法的实现; SortBySELAddress 是一个根据name的地址对方法进行排序的函数。 由上面可以看出:Objective

GraphQL学习之原理篇

删除回忆录丶 提交于 2019-12-05 03:45:31
前言 在上一篇文章 基础篇 中,我们介绍了GraphQL的语法以及类型系统,算是对GraphQL有个基本的认识。在这一篇中,我们将会介绍GraphQL的实现原理。说到原理,我们就不得不依托于GraphQL的规范: GraphQL 概述 GraphQL规范主体部分有6大部分,除去我们在上一节讲到的类型系统(Type System)和语言(Language),剩下的便是整个GraphQL的主流程。也就是如下图所示的: 根据规范的章节,也就是GraphQL的实现流程,我们原理篇一一来看看规范到底定义了些什么,以及在实际的使用中,是如何贴近到规范的实现的。 Js语言的实现版本是: graphql-js 流程总览 首先我们肯定会在客户端上书写查询语句,查询语句在发送到服务端之前会转换为标准的请求体。以之前的 demo 为例子,当我们发起如下的请求的时候: 客户端发起的请求体应该具备以下三个字段(POST请求): { "query": "...", "operationName": "...", "variables": { "myVariable": "someValue", ... } } 截图如下: 参考 Serving over HTTP 这些参数表达了客户端的诉求:调用哪个方法,传递什么样的参数,返回哪些字段。 服务端拿到这段Schema之后

USDT跑分APP定制源码搭建

南笙酒味 提交于 2019-12-05 03:40:39
USDT跑分系统开发系统开发请联系严经理189-2212-1525 微电同号 USDT跑分系统开发APP开发,USDT跑分系统开发源码开发,USDT跑分系统开发系统开发案例,USDT跑分系统开发模式系统开发,USDT跑分系统开发APP定制USDT跑分系统开发APP定制源码搭建USDT跑分系统开发APP搭建开发USDT跑分系统开发系统开发报价USDT跑分系统开发系统开发价格 数字资产结算通道的特点: 1、使用全球主流稳定的结算货币USDT。 USDT稳定的币值更适合用于日常支付与交易,USDT锚定美元,不存在价格剧烈波动,作为平台的计价标准,和美元等价物,更便于客户理解和接受。 2、通道永不被封,资金永不被冻。《Te张生:156*7574*9981可微电》数字资产转账是基于区块链的分布式点对点记账体系,并独立支付系统之外,只需要一串数字密码和数字钱包地址即可以完成转账支付,具有区块链技术的隐匿性、去中心化等特点。 3、个人与个人之间的C2C点对点分散式交易。 全球数字货币的交易均是个人之间的点对点买卖交易,资金分散,通道不会被冻结。 认为是区块链一个很有前景的应用方向。 例如运送方通过扫描二维码来证明货物到达指定区域,并自动收取提前约定的费用,可以参考 区块链如何变革供应链金融 和 区块链给供应链带来透明。 Skuchain 创建基于区块链的新型供应链解决方案

USDT跑分系统开发源码

跟風遠走 提交于 2019-12-05 03:37:40
USDT跑分系统开发系统开发请联系严经理189-2212-1525 微电同号 USDT跑分系统开发APP开发,USDT跑分系统开发源码开发,USDT跑分系统开发系统开发案例,USDT跑分系统开发模式系统开发,USDT跑分系统开发APP定制USDT跑分系统开发APP定制源码搭建USDT跑分系统开发APP搭建开发USDT跑分系统开发系统开发报价USDT跑分系统开发系统开发价格 数字资产结算通道的特点: 1、使用全球主流稳定的结算货币USDT。 USDT稳定的币值更适合用于日常支付与交易,USDT锚定美元,不存在价格剧烈波动,作为平台的计价标准,和美元等价物,更便于客户理解和接受。 2、通道永不被封,资金永不被冻。《Te张生:156*7574*9981可微电》数字资产转账是基于区块链的分布式点对点记账体系,并独立支付系统之外,只需要一串数字密码和数字钱包地址即可以完成转账支付,具有区块链技术的隐匿性、去中心化等特点。 3、个人与个人之间的C2C点对点分散式交易。 全球数字货币的交易均是个人之间的点对点买卖交易,资金分散,通道不会被冻结。 了操作系统、网络通讯、密码学、数学、金融、生产等,我国目前在交叉学科方面尚有不足,人才的匮乏让区块链企业无法乘风而起。 “从9月份到现在已经参加了近20场招聘会,仍没有找到一个合适的区块链技术人才。”济南一家科技公司的负责人王俊永向经济导报记者诉苦道,

榴莲微视系统开发源码

烈酒焚心 提交于 2019-12-05 03:37:09
榴莲微视系统开发请联系严经理189-2212-1525 微电同号,榴莲微视APP开发,榴莲微视源码开发,榴莲微视系统开发案例,榴莲微视模式系统开发,榴莲微视APP定制榴莲微视APP定制源码搭建榴莲微视APP搭建开发榴莲微视系统开发报价榴莲微视系统开发价格 二、榴莲微视运营框架 (一)短视频 短视频通过付费的改革打破传统,吸引众多的用户加入,打造源源不断的基础流量池,引流速度比较稳健,具有可持续性 (二)微店 微店是通过不断增长的用户基数实现流量变现的第一步,也是对于社交零售曝光率限制的一个巨大改革 (三)直播 直播是通过内容输出的方式获取用户的增长,增加用户粘性,在线人数的不限制是快速获取用户和流量变现的第二种途径,弥补了短视频引流的速度缺陷 (四)娱乐 娱乐是流量流通的一种方式,也是用户活跃度的一种体现,在成功的生态圈里,流通是至关重要的,也是资本市场比较看重的一个因素。 三、榴莲微视的总结 榴莲微视是一个集短视频、微店、直播、娱乐的综合型平台,打破了传统的短视频运营模式,通过299的月费制让所有VIP观看视频就可以获取收益,同时,赠送一个共享客源的微店,通过不断提升的曝光率简单快捷的获取产品利润,直播业务的开放能让更多优秀的短视频创造者获取更高的收益,也能快速的为公司带来新的流量和分润,娱乐版块的上线不仅丰富了公司业务,也能在生态圈的搭建上做出很大的贡献,在这个跨界打劫的年代

[Go] gocron源码阅读-判断是否使用root用户执行

我们两清 提交于 2019-12-05 03:10:34
判断是linux系统,并且uid为0,allowRoot是通过命令行传参传进来的,通过flag包解析出来的,可以使用go run node.go -h看到这些参数 if runtime.GOOS != "windows" && os.Getuid() == 0 && !allowRoot { log.Fatal("Do not run gocron-node as root user") return } log.Fatal传入的是一个可变参数v ...interface{},并且可以传入任意类型,可变参数的使用和切片很像 如果要真的传入一个切片,那么切片类型要和参数类型一致 nums := []int{1, 2, 3, 4, 5} Fatal2(nums...) func Fatal2(args ...int) { for _, arg := range args { fmt.Println(arg) } } 完整代码: package main import ( "fmt" "log" "os" "runtime" ) func main() { //可变参数 Fatal("hello", 1) //如果要传切片,切片类型要和参数类型一致 nums := []int{1, 2, 3, 4, 5} Fatal2(nums...) host, _ := os.Hostname()

React源码 ReactElement

陌路散爱 提交于 2019-12-05 03:07:10
我们的JSX里面标签,属性,内容都会传递到React.createElement()这个方法里面。那么这个方法他到底有什么意义以及他的返回,我们叫他ReactElement。他到底有什么样的作用 /** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ import ReactVersion from 'shared/ReactVersion'; import { REACT_CONCURRENT_MODE_TYPE, REACT_FRAGMENT_TYPE, REACT_PROFILER_TYPE, REACT_STRICT_MODE_TYPE, REACT_SUSPENSE_TYPE, } from 'shared/ReactSymbols'; import {Component, PureComponent} from './ReactBaseClasses'; import {createRef} from './ReactCreateRef'; import

hadoop源码阅读环境 eclipse

喜欢而已 提交于 2019-12-05 03:06:15
一.准备工作 1.hadoop源码下载 https://archive.apache.org/dist/hadoop/common/ 本文使用的hadoop版为2.9.2 2.安装JDK 3.安装mvn 4.安装Protocal Buffers https://github.com/protocolbuffers/protobuf/releases/tag/v2.5.0 下载 解压 protoc-2.5.0-win32.zip 到指定目录,例如:E:\protoc-2.5.0-win32,将该路径配置到PATH系统变量中。 执行protoc --version验证变量是否配置成功,如图: 二.创建源码工程 1.安装插件 在安装插件之前可以修改下载源仓库,提高下载速度,具体做法如下: 找到apache-maven-x.x.x/conf/settings.xml配置文件,将如下镜像 <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> 加入到<mirrors></mirrors>中。这一步是选择性的,可以不修改。 (2)进入..

Flink的Partition源码解读

北城以北 提交于 2019-12-05 02:58:15
1.随机分区 dataStream.shuffle()调用,随机 源码 public DataStream<T> shuffle() {    return this.setConnectionType(new ShufflePartitioner()); } ShufflePartitioner类中的selectChannel()方法 public int selectChannel(SerializationDelegate<StreamRecord<T>> record) {    return this.random.nextInt(this.numberOfChannels); } 2.数据进行在平衡(消除数据倾斜) dataStream.rebalance()调用,轮询 源码 public DataStream<T> rebalance() {   return this.setConnectionType(new RebalancePartitioner()); } RebalancePartitioner类中的selectChannel()方法 public int selectChannel(SerializationDelegate<StreamRecord<T>> record) { this.nextChannelToSendTo = (this