鉴于以下数据结构,我想要求" services-list" (一个组件)并接收" entity-list" (一种风格)。
Set padding to parent view of card view to 3dp.
Like,
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
android:background="@android:color/white">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="8dp"
android:id="@+id/card1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFFFF"
android:orientation="horizontal">
<ImageView
android:id="@+id/imgCard"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="10dp"
android:src="@drawable/add_contact" />
<TextView
android:id="@+id/tvColor"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Card View" />
</LinearLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
我的解决方案并不那么优雅:
(def style->components {"entity-list" ["services-list" "employee-list" "clients-list"]})
有更好的方法吗?也许我的问题始于我构建数据的方式。
答案 0 :(得分:3)
你可以通过这种方式让它更短更隐蔽:
(defn get-style-name [comp-name]
(ffirst (filter (fn [[_ v]]
(some #{comp-name} v))
component->style)))
有一个功能ffirst
,其功能与(first (first %))
完全相同
使用过滤函数签名中的解构,您可以检索映射条目的值,避免不必要的let
而不是some
中的此功能:#(= % comp-name)
使用集合是非常常见的:#{comp-name}
然后您可以使用some
代替filter
,因为它返回函数返回的第一个逻辑true值,因此您可以删除ffirst
:
(defn get-style-name [comp-name]
(some (fn [[k v]]
(when (some #{comp-name} v) k))
component->style))
另外,如果您将数据结构更改为使用set而不是vector,则可以使其更短:
(def component->style {"entity-list" #{"services-list"
"employee-list"
"clients-list"}})
(defn get-style-name [comp-name]
(some (fn [[k v]] (when (v comp-name) k))
component->style))
答案 1 :(得分:1)
只是为了添加另一种选择,嵌套序列操作通常可以替换为for
:
(defn get-style-name
[comp-name]
(first
(for [[style-name comp-names] style->components
comp-name' comp-names
:when (= comp-name comp-name')]
style-name)))
不过,我更喜欢一种解决方案,其中预先计算组件名称到样式名称的映射,例如
(def get-style-name
(->> (for [[style-name comp-names] style->components
comp-name comp-names]
[comp-name style-name])
(into {})))
这样,您就可以避免在每次查找时遍历style->components
地图。